2012-03-11 99 views
0

我有下面的類覆蓋:紅寶石 - 引發ArgumentError:錯誤的參數數目(2 1)

class Numeric 
    @@currencies = {:dollar => 1, :yen => 0.013, :euro => 1.292, :rupee => 0.019} 
    def method_missing(method_id) 
    singular_currency = method_id.to_s.gsub(/s$/, '').to_sym 
    if @@currencies.has_key?(singular_currency) 
     self * @@currencies[singular_currency] 
    else 
     super 
    end 
    end 

    def in(destination_currency) 
    destination_curreny = destination_currency.to_s.gsub(/s$/, '').to_sym 
    if @@currencies.has_key?(destination_currency) 
     self/@@currencies[destination_currency] 
    else 
     super 
    end 
    end 
end 

每當在參數是複數,例如:10.dollars.in(:yens)我得到ArgumentError: wrong number of arguments (2 for 1)10.dollars.in(:yen)產生任何錯誤。任何想法爲什麼?

+0

這個問題是題外話,因爲它們只會讓我們關閉錯字/語法相關的問題這樣 – random 2013-07-07 12:44:27

回答

5

你做了一個錯字:destination_curreny是不一樣的destination_currency。所以當貨幣爲複數時,@@currencies.has_key?測試失敗,因爲它是查看原始符號(destination_currency)而不是單一化符號(destination_curreny)。這將通過super呼叫觸發帶有兩個參數(method_iddestination_currency)的method_missing呼叫,但您已聲明您的method_missing需要一個參數。這就是爲什麼你忽略完全引用的錯誤信息是抱怨method_missing而不是in

解決您的錯字:

def in(destination_currency) 
    destination_currency = destination_currency.to_s.gsub(/s$/, '').to_sym 
    #... 
+0

該死的錯字,謝謝花花公子 – 8vius 2012-03-11 06:17:20

+5

@ 8vius:這個傢伙守法。 – 2012-03-11 06:21:23

0

你寫

def in(destination_currency) 

在Ruby中,這意味着你的in方法到底需要一個參數。傳遞更多參數會導致錯誤。

如果你想讓它具有可變數量的參數,這樣做與圖示操作:

def in(*args) 
+0

我不明白,我怎麼通過它多ARGS ? – 8vius 2012-03-11 06:11:02

相關問題