Sunday, 6 November 2011

Note FOR Ruby 1.9 之动态编程

  Ruby中动态编程特性是最Magic的部分,它支持在运行时修改执行的代码,又叫元编程,举两个例子:
  • 双引号中#{}部分可以包含一段简单的表达式,甚至一段函数,一个类
  • attr_accessor传入一个:symbol参数会生成两个方法:symbol和symbol=
  eval:eval提供计算一个字符串形式的Ruby表达式
eval("1 + 2")
  利用eval的特性很容易实现一个类似于irb的程序
  三种特殊的eval:
  1. instance_eval:访问对象的实例变量
  2. ob.instance_eval{ @aVar }
    ob.instance_eval("@aVar")
      由于eval是Object的私有方法,而instance_eval是public的,当然也可以改变eval为public的,但是不推荐
    class Object
        public :eval
    end
  3. module_eval:
  4. module X
    end

    X::module_eval { define_method(:xyz){ } }
  5. class_eval:
  6. class Y
    end

    Y::class_eval { define_method(:abc){ } }
    Y::class_eval('def hi; puts "abc"; end')
  eval的binding参数,Ruby中binding是Binding类实例:
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支持在注释中包含某些格式:

No comments :

Post a Comment