最有用的eval族方法:class_eval
来源:互联网 发布:lol黄金怎么上白金知乎 编辑:程序博客网 时间:2024/05/14 06:50
从本质上讲,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"
但是,可以用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
变量var在标准的类定义体的作用域之外,但是传递给class_eval的代码块的作用域之内。
当在class_eval的块中定义一个实例方法时,又有所不同:
- 1 C.class_eval{ def talk; puts var; end }
- 2
- 3 C.new.talk => undefined loc.'var'..
和任何def一样,在代码块中的def打开了一个新的作用域-所以变量var成为不可访问的。
如果就是想要把外部作用域的变量硬塞到实例方法中,可以使用另外一个技术来生成方法:define_method方法。
为了在实例方法中访问变量var,可以这么做:
- 1 C.class_eval { define_method("talk"){puts var}}
- 2 C.new.talk
- 3 => init
define_method是Module类的实例方法,所以Module或Class的任意实例都可以调用该方法。如果想要在实例方法中访问常规的类定义体中(在此上下文中self是类对象)的局部变量,那么可以在一个通常的类定义体中使用define_method。
0 0
- 最有用的eval族方法:class_eval
- 最有用的eval族方法:class_eval
- [Ruby] ruby创建类方法 ,以及class_eval 、instance_eval的使用
- ruby class_eval的使用
- Ruby meta programming 4(eval/class_eval/module_eval/instance_eval)
- <%#Eval() %>的常用方法
- instance_eval与class_eval的区别
- 取代浮动float的最好方法,最有用
- Eval的日期格式化方法
- Js 代替eval的方法
- javascript的eval()方法
- [随记]Eval的连接方法
- 最有用的语言是什么?
- 最有用的网络命令
- 最有用的网络命令
- 最有用的网络命令
- wtk 最有用的设置
- 大学生最有用的证书
- coredump生成方法
- 点缀精致生活 玻璃花瓶下的家居微景观
- 程序员必知的10大基础实用算法
- Struts如何整合Spring
- 手游《白猫计划》系统概括
- 最有用的eval族方法:class_eval
- nodejs的事件EventEmitter
- 从头到尾彻底解析Hash表算法
- VS2010旗舰版+cocos2d-x-2.1.4安装
- log4j.xml简介
- webstrom open in default browser 在默认浏览器中打开快捷键
- 反汇编 c++/c 确定main函数的位置
- 策略模式
- live方法