[英]Adding methods to base ruby class in rails
我有一個非常簡單的模塊Utility
,在rails應用的lib目錄中的utility.rb
中定義。 它只是向Ruby標准庫中的類添加了兩個簡單的方法。
但是,當我require
此文件時,其中的類不會響應我在此處定義的方法。 例如, [].concat_with
失敗,並顯示NoMethodError
。 為什么?
module Utility
#
# This module just contains useful functions
#
class Array
def concat_with(seperator = "")
reject! { |c| c.empty? }.join(seperator)
end
end
class Float
def flat
"%gx" % (self / 100.00)
end
end
end
那是因為您定義了新類,而不是修補現有類。 這些類是Utility::Array
和Utility::Float
。 在module
子句中,所有內容都在模塊的范圍內。
在Ruby 2.0中,添加了一些改進 ,以允許對現有類進行臨時修補,這看起來像您的情況:
module Utility
#
# This module just contains useful functions
#
refine Array do
def concat_with(seperator = "")
reject! { |c| c.empty? }.join(seperator)
end
end
refine Float do
def flat
"%gx" % (self / 100.00)
end
end
end
然后,您執行以下操作:
using Utility # Obviously, it has to be `required`
puts 3.14.flat
這些方法僅存在於當前范圍內。 一旦您走出去,它們就會消失。
當然,您可以從模塊外部引用類,如下所示:
module Utility
#
# This module just contains useful functions
#
class ::Array
def concat_with(seperator = "")
reject! { |c| c.empty? }.join(seperator)
end
end
class ::Float
def flat
"%gx" % (self / 100.00)
end
end
end
但這將永久地(在過程方面)寫入更改。 有時這可能是合乎需要的,但除非絕對必要,否則我會避免這樣做,因為它很容易與其他庫所做的更改沖突。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.