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 都是一样的.