2011-10-25 136 views
0

我正在學習來自java的ruby dev,我不明白爲什麼即時通訊失敗。 @test是一個類變量,所以我應該能夠輸出它?Ruby錯誤 - 參數錯誤

C:/Projects/RubyPlayground/Tester.rb:6:in `test': wrong number of arguments (ArgumentError) 
    from C:/Projects/RubyPlayground/Tester.rb:6:in `testMethod' 
    from C:/Projects/RubyPlayground/Tester.rb:10 

來源:

class Tester 

    @test = "here" 

    def testMethod() 
    puts test 
    end 

    s = Tester.new() 
    s.testMethod() 

end 
+0

請用s對象創建並將'testMethod'調出類定義。 – WarHog

回答

5

在這種情況下@test成爲類實例變量,並與類對象(不與類實例!)關聯。如果你想@Test表現得像一個Java字段,你必須使用「初始化」的方法:

class Tester 
    def initialize 
    @test = "here" 
    end 
    def testMethod 
    puts @test 
    end 
end 

s = Tester.new() 
s.testMethod 
0

這是 「puts @test」 .............................. ...

+0

好的,但我期望看到@test的值,而不是零,這是curretn輸出。 –

3

你打電話Kernel#test

test(int_cmd, file1 [, file2]) → obj 

Uses the integer <i>aCmd</i> to perform various tests on <i>file1</i> 
(first table below) or on <i>file1</i> and <i>file2</i> (second table). 

我有點驚訝這樣的方法存在。我發現它是由IRB使用self.method(:test)定義,多虧了問題How to find where a method is defined at runtime?

即使你有attr_reader :test作爲@testTester類對象的實例變量(Class類的對象),您的代碼將無法正常工作而不是s實例對象(類Tester的對象)的實例變量。

0

在您的代碼中,您將調用方法Kernel#test,不帶任何參數。然而Kernel#test需要參數,所以你得到一個錯誤,告訴你你沒有提供足夠的參數(即你根本沒有提供任何參數)。

如果在ruby中沒有已經定義的方法測試,那麼您會收到一條錯誤消息告訴您,您試圖調用一個未定義的方法,這可能不會讓您感到困惑。

很明顯,您不打算調用名爲test的方法 - 您想訪問實例變量@test。爲此,你必須寫puts @test而不是puts test。但是,這仍然不能滿足你的要求,因爲你從未在新的Test實例上設置變量@test。您只爲該課程設置@test變量。相反,您應該在Testinitialize方法中設置@test