Я пытаюсь лучше понять правила Ruby и как получить доступ к метаклассу. Я читаю статью Иегуды Каца на метапрограммировании, и я наткнулся на это:Получение доступа к метаклассу в Ruby
matz = Object.new
def matz.speak
"Place your burden to machine's shoulders"
end
matz.class #=> Object
В самом деле, «класс» Мац является его невидимым метаклассом. Мы можем даже получить доступ к метаклассу:
metaclass = class << matz; self; end
metaclass.instance_methods.grep(/speak/) #=> ["speak"]
Что происходит на этой линии:
metaclass = class << matz; self; end
Это то же самое, как:
matz
self
end
?
примечание: 'matz.singleton_methods # => [: speak] ' –
Я смущен тем, что метод [Object # singleton_class] (http://ruby-doc.org/core-2.3.0/Object.html#method-i-singleton_class) является не используется больше. Это позволяет нам написать 'metaclass = matz.singleton_class'. Я думаю, вы согласитесь, что это более читаемо, чем 'metaclass = class << matz; самостоятельно; end'. –