簡體   English   中英

在Rails中為基本的ruby類添加方法

[英]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::ArrayUtility::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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM