Я играю с метапрограммированием в рубине, и у меня есть вопрос. У меня есть класс:
class Klass
class << self
@x = "yeah"
end
end
b = Klass.new
a = class << Klass; self; end
a.instance_eval "@x" #=> yeah
Klass.instance_eval "@x" #=> nil
Почему? В переменной a
у меня есть одноэлементный класс, верно? И Klass.instance_eval
exec в контексте одноэлементного класса:
Klass.instance_eval "def yeah; puts 10; end"
Klass.yeah #=> 10
Кроме того, Klass
в интерпретаторе указывает на контекст класса, да? А a
указывает на контекст одноэлементного класса?
А что означает a.class_eval
и a.instance_eval
? Я:
a.instance_eval "def pops; puts 0; end"
a.class_eval "def popsx; puts 1; end"
a.pops #=> 0
a.popsx # FAIL
Klass.pops # FAIL
Klass.popsx #=> 1
b.pops; b.popsx # DOUBLE FAIL
и я не понимаю этого. Благодарю!