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:

  • Ruby 单例类
  • 向困惑的初学者解释 Ruby 的 Singleton 类(Eigenclass)