instance_eval和singleton方法之间的区别

mha*_*eeb 5 ruby

单例方法是仅在一个实例上定义的方法.

foo = Foo.new
def foo.case
  #singleton method
end
Run Code Online (Sandbox Code Playgroud)

不会instance_eval做同样的事情?为特定实例定义方法?有什么不同?

Jör*_*tag 3

元编程工具也instance_eval能做同样的事情,对吗?为特定实例定义方法?

不,instance_eval与定义方法无关。它在接收者的上下文中评估块。通常,块是词法范围的,包括使用绑定到消息接收者来评估的self块。instance_evalself

one = Object.new
two = Object.new

def one.my_eval; yield end

instance_variables
# => []

one.my_eval { @ivar_one = 1 }

one.instance_variables
# => []

instance_variables
# => [:@ivar_one]

two.instance_eval { @ivar_two = 2 }

two.instance_variables
# => [:@ivar_two]
Run Code Online (Sandbox Code Playgroud)

那么真正的区别是什么?

它们完全无关。询问两个不相关的事物之间的区别实际上没有意义。