в ruby, в чем разница между self.method и методом в классе << self - PullRequest
13 голосов
/ 01 апреля 2011
class Foo

  def self.one; 1 end

  class << self
    def two; 2 end
  end

end
puts Foo.singleton_methods.inspect # => ["two", "one"]

Мне сказали, что приведенные выше методы "один" и "два" концептуально различны, но я не понимаю, как это сделать.Оба они - одноэлементные методы - в чем разница в концепции и применении?

Ответы [ 2 ]

7 голосов
/ 01 апреля 2011

В приложении нет разницы.В принципе, разница невелика, но в первом случае вы работаете в текущем контексте и определяете метод для другого экземпляра класса (на самом деле, метод экземпляра в его собственном классе), тогда как во втором случае вы вводитеконтекст метакласса ("Eigenclass") другого экземпляра класса, а затем определение метода экземпляра.

Редактировать:

Я должен добавить, что причины выбора class << self внекоторые случаи ...

  1. Более чистый синтаксис при определении более чем нескольких методов класса.
  2. Вы можете выполнять другие виды кода в контексте Eigenclass, кроме просто def my_method ....Вы можете, например, сказать attr_accessor :some_attribute в этом блоке кода.
4 голосов
/ 01 апреля 2011

Я настоятельно рекомендую вам прочитать "Метапрограммирование Ruby".В этой книге рассказывается об объектной модели Ruby, включая метод синглтона и класс синглтона.

http://pragprog.com/titles/ppmetr/metaprogramming-ruby

Эта статья также объясняет ту же тему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...