instance_eval和singleton方法之间的区别

时间:2015-12-17 05:32:49

标签: ruby

Singleton方法是仅在一个实例上定义的方法。

foo = Foo.new
def foo.case
  #singleton method
end

没有instance_eval做同样的事情吗?为特定实例定义方法?有什么区别?

2 个答案:

答案 0 :(得分:5)

Object#instance_eval是一种方法,您可以使用该方法为对象定义方法。

Singleton类是一个“地方”,其中为对象“生活”定义的单例方法。

所以这些是完全不同的两件事。

答案 1 :(得分:4)

  

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

没有。 instance_eval与定义方法没有任何关系。它在接收器的上下文中评估块。通常,块是词法范围的,包括self,使用绑定到消息接收者的instance_eval评估使用self评估的块。

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]
  

那真正的区别是什么?

他们是完全无关的。询问两个不相关的事物之间的区别并不是真的有意义。