2010-03-11 165 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。