Объекты-классы, одиночные классы

Я играю с метапрограммированием в 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

и не понимаю этого. Спасибо!

10
задан Marc-André Lafortune 25 December 2011 в 23:44
поделиться