2012-09-04 241 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