Ruby 中 Singleton 类对象的秘密
嘿,很快,您就可以在 Ruby 中找到所有程序中的“escondido”对象。
我是一个好奇的程序员,我想使用 Ruby 语言来使用东方对象的范式,但只要是这样,就可以使用 Ruby 对象,并了解更多信息。定义“House”类时,例如,将对象类定义为“Class”类,将其实例化为“Class”类,通过使用 abaixo 的音调,以“.class”方法来恢复对象类。
class House; end # House é uma instância da classe `Class` House.class # => Class
是否有什么不同的方式来改变以前的方式和功能,以不同的方式获得信用度,从而对我的语言特性产生影响? Eu não uma resposta muito boa e procurei entender mais sobre esse comportamento, até que encontrei a chamada Singleton Class (também encontreireferências que chamam Eigenclass, Classe anônima e Object-Specific Class), a responsável termos em Ruby os chamados métodos de classe, como o desse trecho abaixo。
class House
def self.open
puts "...Opened"
end
end
House.open # => ...Opened但是,与 Ruby 程序员不同的是,这一切都没有任何问题。单例类不允许使用预先定义的对象的附加方法,或者定义对象的方法,但不能重新定义。
class House
def lawn_situation
puts "...this is perfect"
end
end
my_home = House.new
neighbors_house = House.new
def my_home.lawn_situation
puts "...could be better"
end
neighbors_house.lawn_situation # => ...this is perfect
my_home.lawn_situation # => ...could be better解释一下前面的“self.open”类方法,将“House”类和“Class”类对象一起使用,然后使用新的方法(“self.open”)来预定义对象。
作为语法 `def self.open` 和 `def my_home.lawn_situation` 的语法,您可以通过单例类的响应来获取对象的附加方法,并且不直接使用类,允许使用新的方法来执行相应的操作对象。
Acredito que nesse momento conseguimos compreender o que é esse object chamado chamado Class e como utilizamos, mas ainda não discutimos sobre como ele no Impacta na vida real, pois faremos isso agora.
在与阿尔冈斯科尔加斯交谈时,我们可以使用有关辅助阿尔冈斯睾丸的语言特征的方法。没有任何例子可以使用 Singleton 类来实现具体的方法或辅助对象或测试。
# Definindo a classe House
class House
def self.close
self.close_back_door
self.close_windows
self.close_principal_door
nil
end
def self.close_back_door = puts "...Closed Back Door"
def self.close_windows = puts "...Closed Windows"
def self.close_principal_door = puts "...Closed Principal Door"
end
# Testando a classe House
context "Error to close the house" do
def House.close_principal_door
raise EspecificException, "Error to close the principal door"
end
expect(House.close).to raise_error(EspecificException)
end特别是,Ruby 的特性是,我可能会因为错误而尖叫,或者在comportamento 中遇到问题,但在上下文中可能没有任何问题。
class Book
def self.gift_a_friend(friend, book)
@friend = friend
@book = book
return send_now(@book) unless friend_has_this_book?
puts "#{@friend.name} já possui o livro '#{@book}'"
end
private
def self.friend_has_this_book?
puts "Verificando se #{@friend.name} já possui o livro '#{@book}'"
@friend_has_this_book ||= @friend.books.include?(@book)
end
def self.send_now(book)
puts "Enviando o livro '#{book}' para #{@friend.name}!"
@friend.add_book(book)
end
end
class Friend
attr_reader :name, :books
def initialize(name, books = [])
@name = name
@books = books
end
def add_book(book)
@books << book
end
end
joao = Friend.new('João')
guilherme = Friend.new('Guilherme')
Book.gift_a_friend(joao, 'Lord of the Rings')
# Verificando se João já possui o livro 'Lord of the Rings'
# Enviando o livro 'Lord of the Rings' para João!
Book.gift_a_friend(joao, 'Lord of the Rings')
# Verificando se João já possui o livro 'Lord of the Rings'
# João já possui o livro 'Lord of the Rings'
Book.gift_a_friend(guilherme, 'Lord of the Rings')
# Verificando se Guilherme já possui o livro 'Lord of the Rings'
# Guilherme já possui o livro 'Lord of the Rings'
guilherme
# => #
# WTF? Guilherme não possui o livro 'Lord of the Rings' 如果有问题,第二个方法是“.friend_has_this_book?”,对于 chamado,无法执行“@friend.books.include?(@book)”,而“@friend_has_this_book”的价值在于,如果你想在 Singleton 类中创建一个单例类(请参阅以下内容),请执行以下操作:名称 Singleton),作为一个已存在的 Singleton 类的替代方案。
Eu gostaria de ter entendido bem antes esse conceito da linguagem, mas é um ótimo ponto de partida pra quem quer conhecer mais profundamente a language Ruby and suas características, com certeza esses entendimentos irão evitar a os erros and ajudá-lo na通过程序员的方式分析问题。
Espero que tenha gostado, até a próxima.
Algumas fontes que eu usei para entender um pouco mais sobre esse assunto: