class_eval,class_exec,instance_eval,instance_exec

原文出处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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值