2011-12-21 41 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]在标准输出。