Также см. Объяснение метаклассов _why:
http://whytheluckystiff.net/articles/seeingMetaclassesClearly.html
Кроме того, что касается «себя» и его замены, я видел упомянутое в нескольких других местах - мне сложно придумать хороший вариант использования этой функции, хотя это наверняка смутило бы меня. Возможно, есть один. В любом случае это неверный синтаксис в Ruby, чтобы попытаться изменить значение «self»:
>> self = Object.new
SyntaxError: compile error
(irb):1: Can't change the value of self
self = Object.new
^
from (irb):1
from :0
В Ruby и во всех других языках, в которых есть это понятие «я» или «это», оно используется как указатель на «здесь», как, например, текущий объект, класс, метакласс или любой другой объект. представляет то, что означает «здесь». Поскольку Ruby интерпретируется построчно, «self» означает включающий объект, когда компилятор встречает это ключевое слово.
class Array
self # Means Array class (which is an object, actually)
def self.class_method
self # still means Array class, since you're in a class method
end
def hello
self # Means the current instance of Array
end
class << self
self # Means the metaclass (or "eigenclass") of the Array
end
end