2010-03-11 119 views
19

我試圖添加一個函數,可以在我的程序的所有部分訪問。我想要的東西類似於:Ruby on Rails:模塊與類

def GlobalFunctions.my_function(x,y) 
    puts x + y 
end 

對於所有型號都可以訪問。具體來說,我試圖在我的seeds.rb文件中使用這樣的函數,但我很可能會重複使用代碼並且不希望有任何冗餘。現在我知道我可以做一個簡單的課程,但我也可以創建一個模塊。有什麼理由要走這兩個方向?一旦我決定使用哪種類型,我如何在整個程序中使用它?

我已經嘗試了模塊,但我不斷收到「預期的應用程序/ [模塊文件]定義[模塊名]」

回答

43

您可以定義的東西,你會希望的實例的類。在這種情況下,一個模塊可能會更好,因爲模塊基本上只是組代號:

module GlobalFunctions 
    def self.my_function(x,y) 
    puts x+y 
    end 
end 

GlobalFunctions.my_function(4,5) # => 9 

或者,你可以定義它的內核,然後只是把它的任何地方。內核就是定義像puts這樣的方法的地方。

def Kernel.my_function(x,y) 
    puts x + y 
end 

my_function(4,5) # => 9 
+0

非常感謝! – JackCA 2010-03-11 21:42:00

+0

是否有這些模塊要保存的特定位置? – 2013-05-09 19:34:48

+1

我通常把模塊放在'lib'文件夾中。 – Tintin81 2013-05-18 19:27:10

2

PreciousBodilyFluids是正確的,如果這GlobalFunctions是一個回報率項目的一部分,您可能希望將文件命名爲global_functions.rb,並將其放置在lib/目錄來幫助你避免你貼在年底的錯誤信息你的問題。

16

添加方法爲內核(回答PreciousBodilyFluids)通常被認爲是一種難聞的氣味,並可能導致一些真的很難找到在大項目的bug。

它更接受相關命名空間的代碼並放入/ lib /。

class Formatting 
    def self.bold(str) 
    return "<strong>#{str}</strong>" 
    end 
end 

然後,您可以:

require 'formatting' 
puts Formatting.bold("text") 

require 'formatting' 
include Formatting 

puts bold("text") 

這將是清楚的人誰涉及到代碼後你使用的是什麼了。如果你使用Rails,你將不需要require。