Pergunta

É a única classe em Ruby uma classe em si? É a razão pela qual todos os objetos pertencem a "classe?" O conceito é difusa , mas acredito que tem algo a ver com o motivo I pode definir um método de classe em todos (class foo; def foo.bar ...).

O que é a única classe em Ruby?

Foi útil?

Solução

Primeiro, um pouco de definição: um método singleton é um método que é definida apenas para um único objeto. Exemplo:

irb(main):001:0> class Foo; def method1; puts 1; end; end
=> nil
irb(main):002:0> foo = Foo.new
=> #<Foo:0xb79fa724>
irb(main):003:0> def foo.method2; puts 2; end
=> nil
irb(main):004:0> foo.method1
1
=> nil
irb(main):005:0> foo.method2
2
=> nil
irb(main):006:0> other_foo = Foo.new
=> #<Foo:0xb79f0ef4>
irb(main):007:0> other_foo.method1
1
=> nil
irb(main):008:0> other_foo.method2
NoMethodError: undefined method `method2' for #<Foo:0xb79f0ef4>
        from (irb):8
métodos

instância são métodos de uma classe (ou seja, definidos na definição da classe). Métodos de classe são métodos únicos na instância Class de uma classe - eles não são definidos na definição da classe. Em vez disso, eles são definidos no única classe do objeto.

irb(main):009:0> Foo.method_defined? :method1
=> true
irb(main):010:0> Foo.method_defined? :method2
=> false

Você abre a única classe de um objeto com o class << obj sintaxe. Aqui, vemos que esta classe singleton é onde os métodos únicos são definidos:

irb(main):012:0> singleton_class = ( class << foo; self; end )
=> #<Class:#<Foo:0xb79fa724>>
irb(main):013:0> singleton_class.method_defined? :method1
=> true
irb(main):014:0> singleton_class.method_defined? :method2
=> true
irb(main):015:0> other_singleton_class = ( class << other_foo; self; end )
=> #<Class:#<Foo:0xb79f0ef4>>
irb(main):016:0> other_singleton_class.method_defined? :method1
=> true
irb(main):017:0> other_singleton_class.method_defined? :method2
=> false

Assim, um meio alternativo de adicionar métodos únicas para um objeto seria definir-los com o objeto de classe singleton aberta:

irb(main):018:0> class << foo; def method3; puts 3; end; end
=> nil
irb(main):019:0> foo.method3
3
=> nil
irb(main):022:0> Foo.method_defined? :method3
=> false

Em resumo:

  • métodos devem sempre pertencem a uma classe (ou: ser métodos de instância de alguma classe)
  • métodos normais pertencem à classe que está definido em (ou seja, são métodos de instância da classe)
  • métodos de classe são apenas singleton métodos de uma Class
  • métodos únicas de um objecto não são métodos de instância da classe do objecto; em vez disso, eles são métodos de instância da classe singleton do objeto.

Outras dicas

rubi fornece uma maneira de definir métodos que são específicos para um objectivo particular e tais métodos são conhecidos como métodos Singleton. Quando se declara um método singleton em um objeto, Ruby cria automaticamente uma classe para manter apenas os métodos únicos. A classe recém-criado é chamado Singleton Class.


    foo = Array.new
    def foo.size
      "Hello World!"
    end
    foo.size  # => "Hello World!"
    foo.class # => Array
    #Create another instance of Array Class and call size method on it
    bar = Array.new
    bar.size  # => 0
classe Singleton é classe anônima objeto específico que é criado automaticamente e inserido na hierarquia de herança.

singleton_methods pode ser chamado em um objeto para obter a lista de nomes para todos os métodos únicos em um objeto.

    foo.singleton_methods  # => [:size]
    bar.singleton_methods  # => []

Este artigo realmente me ajudou a entender Classes Singleton em Ruby e tem um código de boa exemplo.

Como apenas atualizar a resposta @Pistos, a partir da versão 1.9.2 Ruby adicionar nova sintaxe para a obtenção de classe Singleton

 singleton_class = ( class << foo; self; end )

pode ser substituída por:

singleton_class = foo.singleton_class

https://apidock.com/ruby/Object/singleton_class

A maneira mais pragmática / oreinted-action para pensar sobre isso (IMHO) é: como uma cadeia de herança, ou o método de ordem de procura / resolução. Esta imagem poderia ajudar

http: // www.klankboomklang.com/2007/11/25/modules-part-i-enter-the-include-class/

Este é r 1,9, contrastando builtin e classes definidas pelo usuário:. Eu ainda estou digerindo este

http://d.hatena.ne.jp/sumim/20080111/p1

Além disso, eu htink um uso confuso do termo é "objeto Singleton", que é diferente conceito. Um objeto singleton vem de uma classe que tem o seu método construtor / instantiator substituído de modo que você pode alocar apenas uma dessa classe.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top