Анонимные занятия в Ruby - PullRequest
2 голосов
/ 16 июня 2011

У меня два вопроса:

  1. Принадлежит ли метод f_1 анонимному классу метакласса?
  2. Принадлежит ли метод f_2 анонимному классу?

относится к следующему коду:

car = "car"

class << car
  def self.f_1
    puts "f_1"
  end
  def f_2
    puts "f_2"
  end
end

Ответы [ 4 ]

4 голосов
/ 16 июня 2011

Поскольку собственный API ruby ​​использует термин " singleton class ", я бы сказал, что верно следующее:

  1. f_1 - это метод класса дляСинглтон-класс автомобиля и может называться следующим образом:

    car.singleton_class.f_1
    
  2. f_2 - это метод экземпляра синглтон-класса автомобиля и может вызываться так:

    car.f_2
    
1 голос
/ 16 июня 2011

Ну, терминология - хрупкая, но я бы сказал, что ваш класс на самом деле не был анонимным. Что касается принадлежности, оба эти метода существуют только в объекте автомобиля.

Я буду честен и признаю, что я немного расплывчат в разнице между методом класса и методом экземпляра, когда класс определен для отдельного объекта, подобного этому - я бы предположил, что если есть какая-либо разница , он будет неясным, что сделает ваш код намного труднее для чтения;)

Обновление: это может оказаться полезным, если вы его раньше не видели. (Лично у меня болит голова, но все разные ...)

0 голосов
/ 27 июля 2011

Переформулировка ответа Роба Дэвиса:

  1. Метод-владелец :f_1 равен car.singleton_class.singleton_class.
  2. Метод-владелец :f_2 равен car.singleton_class.

Цепочка car & rarr; car.singleton_class & rarr; car.singleton_class.singleton_class соответствует нижнему ряду на диаграмме http://www.atalon.cz/rb-om/ruby-object-model/#sc-inheritance-sample.

Примечания:

  • Код НЕ создает новый класс (в частности, анонимный класс не создается).
  • В большинстве программ на Ruby собственные классы собственных классов НЕ делаются "актуальными" (см. http://www.atalon.cz/rb-om/ruby-object-model/#actual-lists).
0 голосов
/ 17 июня 2011

У меня сложилось впечатление, что анонимный класс - это класс без имени:

my_class = Class.new
my_class.name # => nil

Однако кирка именует его как неназванный класс, а не как анонимный класс.

...