Back

ruby的eval, class_eval, instance_eval

发布时间: 2015-06-30 00:42:00

refer to:  https://4loc.wordpress.com/2009/05/29/eval-module_eval-and-instance_eval

eval: 上来就运行代码.  例如:

eval(" a = 1;  puts a+1 ")  #=> 2
b = 3
eval(" puts b")  # => 3
@forty = 40
eval(" puts @forty")  # => 40

instance_eval: 在某个instance的范围内运行代码. 可以直接使用 @ 变量.

class Apple
  def color
    @color
  end 
end

apple = Apple.new
puts apple.color # =>
apple.instance_eval("@color = 'red'")
puts apple.color

class_eval/module_eval: 针对某个 instance 的范围内(上下文内)运行代码.  可以认为它俩一样. 注意:class_eval 不是为某个 class增加  class_method.    

class_exec / module_exec:  针对某个Class/Module的范围内运行代码. 可以认为它俩一样.  可以认为它俩跟 xx_eval 一样, 不同之处是它们接收的不是string 而是 block, 还可以加参数. 

可以认为  eval, self.instance_eval 都是一样的. 

Back