ruby中的send,xxx_eval方法
阿新 • • 發佈:2019-01-22
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 Klassdef initialize @secret = 99 end end
k = Klass.new k.instance_eval { @secret } #=> 99class_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