- 双引号中#{}部分可以包含一段简单的表达式,甚至一段函数,一个类
- attr_accessor传入一个:symbol参数会生成两个方法:symbol和symbol=
eval("1 + 2")
利用eval的特性很容易实现一个类似于irb的程序
三种特殊的eval:
- instance_eval:访问对象的实例变量
- module_eval:
- class_eval:
ob.instance_eval{ @aVar }
ob.instance_eval("@aVar")
由于eval是Object的私有方法,而instance_eval是public的,当然也可以改变eval为public的,但是不推荐
class Object
public :eval
end
module X
end
X::module_eval { define_method(:xyz){ } }
class Y
end
Y::class_eval { define_method(:abc){ } }
Y::class_eval('def hi; puts "abc"; end')
def getBinding(str)
return binding()
end
str = "hello"
puts eval("str + ' Fred'")
puts eval("str + ' Fred'", getBinding("bye"))
binding方法是Kernel模块的私有方法,在这里binding是返回当前上下文的str值,所以第一个eval的上下文为main,第二个eval的上下文为getBinding方法。
类变量操作:class_variable_get/class_variable_set/class_variables
类实例变量操作:instance_variable_get/instance_variable_set/instance_variables
类常量操作:const_get/const_set
to_sym: 转换为Symbol
remove_method移除类的某方法,而其父类的此方法保持不变;undef_method禁止调用某方法,通过实现method_missing方法来改变当调用某未定义方法时的默认行为
附:RDoc
生成文档:rdoc
rdoc支持在注释中包含某些格式:
- * *: 加粗
- _ _: 斜体
- + +: typewriter 字体
- #-- #++:包含的注释不会生成到RDoc
- :title:
- 其他格式详见:http://rdoc.sourceforge.net/doc/index.html
No comments :
Post a Comment