我似乎无法理解这两个“构造”之间的确切区别。在我看来,以下小脚本应该输出相同的内容三次:
class Example
puts self
class << self
puts self
end
instance_eval do
puts self
end
end
但是,输出是:
Example
#<Class:Example>
Example
这是我的理由:
-
Example
是Class
的实例, 所以self
在类主体中指的是; -
class << obj
套self
随便什么obj
在给定的 block 中,在我的例子中是Class
的实例那是Example
(这是我可能错的地方); -
instance_eval
在给定实例中运行 block ,因此,在我的例子中,这与将代码直接放入类主体中的 block 几乎相同。
我目前的猜测是 class << self
在 Example
之间插入一个幽灵类和 Class
并将 self 设置为那个,但是 #<Class:Example>
的输出根本没有确认这一点。
那么我的理由有什么问题呢?
最佳答案
class << obj
setsself
to whateverobj
is in the given block, which in my case is the instance ofClass
that isExample
(this is where I'm probably wrong);
不,class << obj
打开 obj
的 单例类 .正如您正确指出的那样,在类声明中,self
指的是类本身,因此,在这种情况下,“内部”self
(即传递给 puts
的那个)指的是 Example
的 单例类 .
关于ruby - instance_eval 和 class << self 之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5805315/