rails之 最有用的eval族方法:class_eval

从本质上讲,class_eval(也就是module_eval)可进入类定义体中:

1  c = Class. new
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 
但是,可以用class_eval做某些class关键字不能做的事: 

1.在类定义的上下文中对字符串求值。
2.为匿名类(不包含单例类)打开类定义。
3.获取外围作用域中变量的访问权。
特别是第3个值得注意,如下代码:

1  var   =   " init var "
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 

变量var在标准的类定义体的作用域之外,但是传递给class_eval的代码块的作用域之内。

当在class_eval的块中定义一个实例方法时,又有所不同:

1  C.class_eval{ def talk; puts  var ; end }
2 
3  C. new .talk   =>  undefined loc. ' var ' ..
4 

和任何def一样,在代码块中的def打开了一个新的作用域-所以变量var成为不可访问的。

如果就是想要把外部作用域的变量硬塞到实例方法中,可以使用另外一个技术来生成方法:define_method方法。

为了在实例方法中访问变量var,可以这么做:

1  C.class_eval { define_method( " talk " ){puts  var }}
2  C. new .talk
3       =>  init 
这样的技术员不会像标准的类和方法定义那样经常地使用,但是在看到它们的时候,就知道它们暗示着一个扁平化的局部变量作用域。而不是像更通用的class和def那样打开新的作用域。
define_method是Module类的实例方法,所以Module或Class的任意实例都可以调用该方法。如果想要在实例方法中访问常规的类定义体中(在此上下文中self是类对象)的局部变量,那么可以在一个通常的类定义体中使用define_method。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值