【发布时间】:2010-10-28 09:02:25
【问题描述】:
Foo = Class.new
Foo.class_eval do
def class_bar
"class_bar"
end
end
Foo.instance_eval do
def instance_bar
"instance_bar"
end
end
Foo.class_bar #=> undefined method ‘class_bar’ for Foo:Class
Foo.new.class_bar #=> "class_bar"
Foo.instance_bar #=> "instance_bar"
Foo.new.instance_bar #=> undefined method ‘instance_bar’ for #<Foo:0x7dce8>
仅基于方法的名称,我希望 class_eval 允许您向 Foo 添加一个类方法,而 instance_eval 允许您向 Foo 添加一个实例方法。但他们似乎反其道而行之。
在上面的例子中,如果你在 Foo 类上调用 class_bar,你会得到一个未定义的方法错误,如果你在 Foo.new 返回的实例上调用 instance_bar,你也会得到一个未定义的方法错误。这两个错误似乎都与对 class_eval 和 instance_eval 应该做什么的直观理解相矛盾。
这些方法之间的真正区别是什么?
class_eval 的文档:
mod.class_eval(字符串 [, 文件名 [, lineno]]) => 对象
计算字符串或块 mod的上下文。这可以用来 为类添加方法。
instance_eval 的文档:
obj.instance_eval {| |块 } => 对象
计算一个包含 Ruby 的字符串 源代码或给定的块, 在接收者的上下文中 (对象)。为了设置上下文, 变量 self 设置为 obj 而 代码正在执行,给出代码 访问 obj 的实例变量。
【问题讨论】:
标签: ruby class-method instance-method