Каков точно singleton-класс в рубине?

75
задан sawa 28 February 2019 в 12:54
поделиться

2 ответа

Во-первых, немного определения: одноэлементный метод является методом, который определяется только для отдельного объекта. Пример:

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

Методы экземпляра являются методами класса (т.е. определенный в определении класса). Методы класса являются одноэлементными методами на Class экземпляр класса - они не определяются в определении класса. Вместо этого они определяются на singleton-класс объекта.

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

Вы открываете singleton-класс объекта с синтаксисом class << obj. Здесь, мы видим, что этот singleton-класс - то, где одноэлементные методы определяются:

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

, Таким образом, альтернативное средство добавляющих одноэлементных методов к объекту состояло бы в том, чтобы определить их с открытым singleton-классом объекта:

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

, Таким образом:

  • методы должны всегда принадлежать классу (или: будьте методами экземпляра некоторого класса)
  • , нормальные методы принадлежат классу, они определяются в (т.е. методы экземпляра класса)
  • , методы класса являются просто одноэлементными методами Class
  • , одноэлементные методы объекта не являются методами экземпляра класса объекта; скорее они - методы экземпляра singleton-класса объекта.
141
ответ дан Pistos 24 November 2019 в 11:32
поделиться

Большая часть pragmatic/action-oreinted способа думать о нем (по моему скромному мнению): как цепочка наследования или порядок поиска/разрешения метода. Это изображение могло бы помочь

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

, Это - r 1.9, контрастируя встроенные и пользовательские классы: я все еще перевариваю этого.

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

кроме того, я думаю, что запутывающее использование термина является "объектом Singleton", который является различным понятием. Одноэлементный объект прибывает из класса, которому переопределили его constructor/instantiator метод так, чтобы можно было выделить только один из того класса.

4
ответ дан Gene T 24 November 2019 в 11:32
поделиться