Я играю с метапрограммированием в Ruby, и у меня есть вопрос. У меня есть класс:
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
и не понимаю этого. Спасибо!