В рубине какая разница между 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