rails之 最有用的eval族方法:class_eval
从本质上讲,class_eval(也就是module_eval)可进入类定义体中: 1.在类定义的上下文中对字符串求值。 变量var在标准的类定义体的作用域之外,但是传递给class_eval的代码块的作用域之内。 和任何def一样,在代码块中的def打开了一个新的作用域-所以变量var成为不可访问的。 如果就是想要把外部作用域的变量硬塞到实例方法中,可以使用另外一个技术来生成方法:define_method方法。 为了在实例方法中访问变量var,可以这么做:
2 c.class_eval do
3 def some_method
4 puts "created in class_eval"
5 end
6 end
7 C.new.some_method => "created in class_eval"
8
2.为匿名类(不包含单例类)打开类定义。
3.获取外围作用域中变量的访问权。
特别是第3个值得注意,如下代码:
2 class C
3 puts var
4 end => NameError:undefined local variable or method 'var' for C:Class..
5
6 C.class_eval {puts var}
7 => init var
8
当在class_eval的块中定义一个实例方法时,又有所不同:
2
3 C.new.talk => undefined loc.'var'..
4
2 C.new.talk
3 => init
define_method是Module类的实例方法,所以Module或Class的任意实例都可以调用该方法。如果想要在实例方法中访问常规的类定义体中(在此上下文中self是类对象)的局部变量,那么可以在一个通常的类定义体中使用define_method。