![](/img/trans.png)
[英]How can I dynamically add a method to the Math class in Ruby on Rails?
[英]When and how is it useful to dynamically add a method to a Ruby object?
我一直在嘗試從“基礎良好的Rubyist”那里學習Ruby,並且遇到了在運行時向對象添加方法的想法:
obj = Object.new
obj.respond_to? "hello" # Returns false
def obj.hello
puts "something"
end
obj.respond_to? "hello" # Returns true
obj.hello() # Output is "something"
我有Python和Java的背景知識,我無法想象有任何方式可以使用這個新想法。 那么,這有什么用呢? 它如何適應面向對象編程的精神? 在運行時執行此操作是否昂貴?
總是有很長的清單,您可以使用任何一種語言進行操作,但是如果沒有充分的理由,則不應該這樣做,並且擴展單個對象肯定是該清單上的重點。
通常,您不會定義單獨的方法,但是您可能會包含很多方法:
module Extensions
def is_special?
true
end
end
obj = Object.new
obj.send(:extend, Extensions)
obj.is_special?
# => true
Rails的ActiveRecord這樣做是根據Rails實例啟動時的架構,為模型動態創建模型的方法,因此每一列都有一個關聯的方法。 這種動態編程可用於使代碼無縫適應不斷變化的環境。
在很多情況下,您都希望明確地將其拼寫出來,以便對您的方法進行充分的文檔記錄,但是對於那些無關緊要的情況,動態響應總比在代碼中維護架構和關聯方法等兩件事要好。 ,那么它可能是最好的選擇。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.