1. 程式人生 > >ruby中的send,xxx_eval方法

ruby中的send,xxx_eval方法

send的使用:
class Klass
     def hello(*args)
       "Hello " + args.join(' ')
     end
end
k = Klass.new
k.send :hello, "gentle", "readers"   #=> "Hello gentle readers"

send其實就是動態地根據名字呼叫函式,傳遞後面的內容作為呼叫引數,api函式原型為:
obj.send(symbol [, args...]) => obj

作為指令碼語言,ruby自然也有eval這樣的函式,除此之外,還有instance_eval和class_eval
instance_eval感覺就是取出物件的裡的變數
class Klass
def initialize @secret = 99 end end
k = Klass.new
k.instance_eval { @secret }   #=> 99
class_eval(alias module_eval)就比較重要了,實現類的動態性方面作用很大,rails的框架裡就大量使用了class_eval來動態豐富類的成員
class Thing
end
a = %q{def hello() "Hello there!" end}
Thing.module_eval(a)
puts Thing.new.hello()   =>  "Hello there!"
在rails裡的action_controller.rb裡
ActionController::Base.class_eval do
  include ActionController::Flash
  include ActionController::Filters
。。。。
end