我知道我做了一些愚蠢的事情或者没有做一些聪明的事情 - 我经常对两者都感到内疚.
这是一个让我痛苦的例子:
我有一个模块保存在/ lib中作为test_functions.rb,看起来像这样
module TestFunctions def abc puts 123 end end
进入ruby脚本/跑步者,我可以看到模块正在自动加载(良好的配置以及所有......)
>> TestFunctions.instance_methods => ["abc"]
所以这个方法是已知的,让我们试试吧
>> TestFunctions.abc NoMethodError: undefined method `abc' for TestFunctions:Module from (irb):3
不.这个怎么样?
>> TestFunctions::abc NoMethodError: undefined method `abc' for TestFunctions:Module from (irb):4
再试一次.
defined?(TestFunctions::abc) #=> nil, but TestFunctions.method_defined? :abc #=> true
就像我在顶部说的那样,我知道我是愚蠢的,有人会让我失望吗?
如果你想要Module
-level函数,可以用以下任何方式定义它们:
module Foo def self.method_one end def Foo.method_two end class << self def method_three end end end
所有这些方法将使方法可作为Foo.method_one
或Foo::method_one
等
正如其他人所提到的,在实例方法Module
s为你到哪儿去这地方有哪些方法include
d是Module
我将尝试自己总结各种答案,因为每个人都有一些有价值的东西可以说,但没有一个真正得到我现在意识到的可能是最好的回答:
我问的是错误的问题,因为我做错了.
由于我无法解释的原因,我想在库中使用一组完全独立的函数,这些函数代表了我试图从我的课程中干掉的方法.这可以通过使用类似的东西来实现
module Foo def self.method_one end def Foo.method_two end class << self def method_three end end def method_four end module_function :method_four end
我也include
可以在我的模块中,在一个类中,在这种情况下,方法成为类的一部分或外部,在这种情况下,它们是在我正在运行的任何类中定义的(对象?内核?Irb,如果我是交互式的?可能不是一个好主意,然后)
问题是,没有充分的理由不在一开始就上课 - 我不知不觉地接受了一条思路,让我失去了一个很少使用和坦率的有点奇怪的分支线.可能是OO成为主流之前的回忆(我已经够老了,直到今天我已经花了很多年时间编写程序代码).
所以这些函数已经进入了一个类,它们看起来很开心,并且在必要时可以愉快地使用这样暴露的类方法.
您也可以像这样使用module_function:
module TestFunctions def abc puts 123 end module_function :abc end TestFunctions.abc # => 123
现在,您可以在类中包含TestFunction并从TestFunctions模块中调用"abc".
我搞砸了一会儿,学到了几件事.希望这会帮助其他人.我正在运行Rails 3.2.8.
我的模块(utilities.rb)看起来像这样,位于我的rails app的/ lib目录中:
module Utilities def compute_hello(input_string) return "Hello #{input_string}" end end
我的测试(my_test.rb)看起来像这样,位于我的rails应用程序的/ test/unit目录中:
require "test_helper" require "utilities" class MyTest < ActiveSupport::TestCase include Utilities def test_compute_hello x = compute_hello(input_string="Miles") print x assert x=="Hello Miles", "Incorrect Response" end end
以下是一些需要注意的事项:我的测试扩展了ActiveSupport :: TestCase.这很重要,因为ActiveSupport将/ lib添加到$ LOAD_PATH.(seehttp://stackoverflow.com/questions/1073076/rails-lib-modules-and)
其次,我需要"需要"我的模块文件,并且还"包含"模块.最后,重要的是要注意从模块中包含的内容基本上放在测试类中.所以...请注意,您包含的模块不以"test_"开头.否则,Rails将尝试将您的模块方法作为测试运行.