原文出处http://blog.58share.com/?p=370
class_eval
class_eval的调用者是类,在class_eval的block的内部,self既是该类自己
1 | class A; end |
2 | a = A.new |
3 |
4 | # block self is himself |
5 | A.class_eval do |
6 | puts self # => A |
7 | end |
8 |
9 | # instance_method 动态生成实例方法 |
10 | A.class_eval do |
11 | def demo |
12 | puts 'aa' |
13 | end |
14 | end |
15 | a.demo |
16 |
17 | A.class_eval do |
18 | # instance method |
19 | define_method :mymethod do |
20 | puts 'mymethod' |
21 | end |
22 |
23 | # class method |
24 | define_singleton_method :singletion_method do |
25 | puts 'singletion_method' |
26 | end |
27 |
28 | # compatibility for 1.9.3 1.8.3 |
29 | # 类class本身也是Class类的一个实例 |
30 | (class << self |
31 | self # #<Class:A> A instance.. |
32 | end).instance_eval do |
33 | puts self # #<Class:A> A instance |
34 | define_method :compatibility do |
35 | puts 'compatibility' |
36 | end |
37 | end |
38 | end |
39 |
40 | a.mymethod # => mymethod |
41 | A.singletion_method # => singletion_method |
42 | A.compatibility # => compatibility |
class_exec
class_exec和class_eval都是执行block,放入当前class/module环境中执行,定义实例方法
instance_eval
instance_eval 的调用者为实例instance,在instance_eval内部调用者既是调用者本身
1 | class A; end |
2 | a = A.new |
3 | a.instance_eval do |
4 | self # => a |
5 | # current class => a's singleton class |
6 | def method1 |
7 | puts 'this is a singleton method of instance a' |
8 | end |
9 | end |
10 | a.method1 |
11 | #=> this is a singleton method of instance |
12 |
13 | # 类class本身也是Class类的一个实例 |
14 | class A |
15 | end |
16 |
17 | A.instance_eval do |
18 | self # => A |
19 | # current class => A's singleton class |
20 | def method1 |
21 | puts 'this is a singleton method of class A' |
22 | end |
23 | end |
24 |
25 | A.method1 #=> this is a singleton method of class A |
instance_exec
instance_exec的执行环境在singleton_class下
1 | class App |
2 | def self.helper(name, &block) |
3 | define_method(name) do |*args| |
4 | instance_exec(*args, &block) |
5 | end |
6 | end |
7 | end |
8 |
9 | App.helper(:foo) {|bar| p bar} |
10 | App.new.foo( 'bar' ) |
reference: http://ruby-china.org/topics/2442