2012-09-04 206 views
3

我在写我的第一个Ruby的模块,我有这样的:访问方法在Ruby中模块

/app/module/test_modules/test.rb

test.rb类似于:

module TestModules 
    module Test 

    def test 
     puts 'this is a test' 
    end 
    end 
end 

当我打电话从控制台下,我得到:

(main)> TestModule::Test.test 
//NoMethodError: private method `test' called for TestModules::Test:Module 

我如何测试()可见?

+0

'NoMethodError:呼吁TestModules ::测试私有方法 '测试':Module'造成HTTP://一pidock.com/ruby/Kernel/test – sumskyi

+0

为什么downvotes?我能做些什么来改善这个问题吗? – doremi

+0

可能是因为这是一个非常简单的Ruby问题,并且您误解了发生的事情。 –

回答

3

要调用一个类的方法,而您将test定义为实例方法。如果您通过includeextend使用模块,则可以按照您的要求进行调用。 This article做得很好解释。

module TestModules 
    module Test 
    def self.test 
     puts 'this is a test' 
    end 
    end 
end 
+0

它不起作用。我在调用TestModules :: Test.test时遇到同样的错误 – doremi

+0

@doremi你使用的是什么版本的ruby?它适用于Ruby 1.9.2-p290。 –

+0

红宝石1.9.3p194 - 我刚刚重新启动控制台,现在得到一个不同的错误。这可能是因为我打破了别的东西。我正在寻找... – doremi

0

你定义的测试方法是实例方法...试试这个

module TestModules 
    module Test 
    def self.test 
     puts 'this is a test' 
    end 
    end 
end 

现在你可以通过这个TestModules调用方法:: Test.test

1

此外,

1)

module TestModules 
    module Test 
    def test 
     puts 'this is a test' 
    end 

    module_function :test 
    end 
end 

2)

module TestModules 
    module Test 
    extend self 
    def test 
     puts 'this is a test' 
    end 
    end 
end 
+0

我不知道'module_function'方法,这很有趣。尽管如此,我认为第二种方法并不是一个明智的主意。它可以工作,但如果他们不知道它在那里,可能真的会把某人绑起来。 –

+0

'extend self'是模块可测试的常用方法 – sumskyi

1

您已经定义了你的方法的方式,它是对Test实例的方法 - 因此它会工作,如果你这样做:

blah = TestModule::Test.new 
blah.test 

- 而且不要使用这种方式,你需要定义Testclass不是module

如果你想在类自身工作中的作用,那么你需要将它定义像这样:

def self.test 
    .... 
end 

然后你就可以做TestModules::Test.test