В рубине какая разница между self.method и методом внутри класса << self
class Foo
def self.one; 1 end
class << self
def two; 2 end
end
end
puts Foo.singleton_methods.inspect # => ["two", "one"]
Мне сказали, что вышеупомянутые методы "один" и "два" концептуально отличаются, но я не понимаю, как это сделать.
Они оба являются одноточечными методами - какова разница в концепции, а также в применении?
Ответы
Ответ 1
В приложении нет разницы. По понятию разница является тонкой, но в первом случае вы работаете в текущем контексте и определяете метод для другого экземпляра класса (фактически, метод экземпляра в Eigenclass), тогда как во втором случае вы входите контекст метакласса ( "Eigenclass" ) другого экземпляра класса, а затем определение метода экземпляра.
Edit:
Я должен добавить, что причины выбора class << self
в некоторых случаях...
- Чистый синтаксис при определении более чем нескольких методов класса.
- Вы можете выполнять другие типы кода в контексте Eigenclass, кроме как только
def my_method ...
. Вы можете, например, сказать attr_accessor :some_attribute
в этом блоке кода.
Ответ 2
Я настоятельно рекомендую вам прочитать "Метапрограммирование рубинов".
В этой книге объясняется модель объекта Ruby, в том числе метод singleton и singleton class.
http://pragprog.com/titles/ppmetr/metaprogramming-ruby
В этой статье также описывается одна и та же тема.
http://www.contextualdevelopment.com/articles/2008/ruby-singleton