2011-12-21 44 views
0

這裏的問題中......紅寶石 - 調用從一個循環的方法的另一種方法

我有我打電話給去掉字符和字符串轉換成浮點數的方法。

def convert_to_float(currency) 
    return currency.gsub(/regex/, "").to_f 
end 

我有另一種接收字符串值的方法。我想要做的是通過convert_to_float方法迭代那些收到的字符串,而不是將gsub應用到每一行。這就是我所得到的......甚至可以用我這樣做的方式呢?

def verify_amounts(total,subtotal,tax) 
    arrayoftotals = [total,subtotal,tax] 
    arrayoftotals.each do |convert_to_float| 
    end 

    ftotal = arrayoftotals[0] 
    raise "ftotal must be a Float" unless ftotal.kind_of? Float 
end 

到目前爲止,它提出了錯誤,指出該類型不是一個浮動,它告訴我,每個循環都不會轉換值。

幫助。

謝謝!

回答

1

仔細檢查後發現有兩件事情出錯了。

  1. 您的將方法作爲迭代函數傳遞的語法是錯誤的。

    arrayoftotals.each do |convert_to_float| 
    end 
    

    在本地變量名爲convert_to_float的情況下出現空白塊。您正在查找的語法是:

    arrayoftotals.each (&method (:convert_to_float)) 
    

    這會將引用方法convert_to_float的Proc對象作爲塊傳遞。你不更新數組中的值。所以即使調用了convert_to_float,它也不會執行任何操作。

    要麼將​​gsub更改爲gsub!破壞性地清理你的字符串,或使用地圖!而不是用數組中的每個元素替換調用函數的結果。地圖!是一個更好的選擇,因爲這意味着你不必調整convert_to_float的所有其他用法。

全部放在一起:

def convert_to_float(currency) 
    return currency.gsub(/regex/, "").to_f 
end 

def verify_amounts(total,subtotal,tax) 
    arrayoftotals = [total,subtotal,tax] 
    arrayoftotals.map! (&method (:convert_to_float) 

    ftotal = arrayoftotals[0] 
    raise "ftotal must be a Float" unless ftotal.kind_of? Float 

end 
+0

我唯一需要改變的是: arrayoftotals = [total,subtotal,tax] .map!(&方法(:convert_to_float) 之後它是完美的。感謝EmFi。 – r3nrut 2011-12-21 04:43:45

+0

如果這就是你所做的,那麼你不需要map !. map會做得很好 – EmFi 2011-12-21 14:25:22

+0

畢竟說完了,儘管這個解決方案工作arrayoftotals = [] [total,subtotal,tax] .each {| a | arrayoftotals << convert_to_float(a)} – r3nrut 2011-12-27 21:40:04

2

聽起來像你正在尋找map

arrayoftotals = [total, subtotal, tax].map { |x| convert_to_float(x) } 

,或者因爲convert_to_float是一種方法,同一個班verify_amounts ,你可以用Object#method method這樣寫:

arrayoftotals = [total, subtotal, tax].map(&method(:convert_to_float)) 

例如,這樣的:

class Pancakes 
    def convert_to_float(currency) 
     currency.gsub(/[^\d.]/, '').to_f 
    end 

    def verify_amounts(total, subtotal, tax) 
     arrayoftotals = [total, subtotal, tax].map(&method(:convert_to_float)) 
     puts arrayoftotals.inspect 
    end 
end 

Pancakes.new.verify_amounts('where1.0', '2.is0', '3.0house') 

會給你[1.0, 2.0, 3.0]在標準輸出。