看看這個 (編輯用更少的草率代碼)古怪的實例變量毛刺
class Numeric
@@currencies = {'dollar' => 1, 'yen' => 0.013, 'euro' => 1.292, 'rupee' => 0.019}
attr_writer :previous_currency
def method_missing(method_id)
singular_currency = method_id.to_s.gsub(/s$/, '')
if @@currencies.has_key?(singular_currency)
@previous_currency = singular_currency
self * @@currencies[singular_currency]
else
super
end
end
def in(currency)
singular_currency = currency.to_s.gsub(/s$/, '')
rate = @@currencies[singular_currency]
if @@currencies[@previous_currency] < rate
self/rate
else
self * rate
end
end
end
這個擴展到數字類允許執行以下操作:
<Number>.<currency>.in(:<other_currency>)
像5.dollars.in(:euros)
如果我有dollars
作爲我第一個缺失的方法,它工作得很好。 @previous_currency
在第一次拍攝時獲得值dollar
,然後在缺少方法in
的調用中,它保留了它的值並進行了轉換。但是,如果我嘗試其他任何代替dollars
或dollar
,@previous_currency
不知何故在in
通話失去了它的價值,成爲nil
再次,導致下面的錯誤
NoMethodError: undefined method ` for nil:NilClass
我試着改用美元發生在@@currencies
哈希,但同樣的行爲再次發生。
Ruby是否更喜歡美元?
這是一個超級馬虎的寫作這btw的方式。爲什麼不直接定義'in'方法,而不是依賴'method_missing'?正如所寫,你可以做'5.dollars.viugdkaugehtkauge(:euros)'。 – meagar