2013-01-21 111 views
1

我们如何实现哈希值的浮点数“就地”转换?动机是不必写一堆像这样的代码如何将字符串转换为哈希值浮点数

r['delivery_fee'] = r['delivery_fee'].to_f 
r['delivery_free_over'] = r['delivery_free_over'].to_f 
r['delivery_possible_over'] = r['delivery_possible_over'].to_f 
r['delivery_range'] = r['delivery_range'].to_f 

而是

to_f r['delivery_fee'] 
to_f r['delivery_free_over'] 
# ... 

我这样做,但它不工作打算的方式。

def to_f(s) 
    s = s.to_f 
end 

data = "1" 
p data # => "1" 
to_f data 
p data # => Still "1" and not float 
+1

你会感到困惑。您的动机是将值更改为散列中的某个键。你尝试过(而失败)正在改变某个变量的指称。 – sawa

回答

2

正如所说的dbenhur,你需要改变你的哈希值,而不是hash[key]的结果字符串。

h = {:key => 'value'} 
def to_f(h, key) 
    h[key] = h[key].to_f 
end 
to_f(h, :key) 
# => 0.0 
h 
# => {:key=>0.0} 
+0

'+ 1'给你很好的提示! :) –

3

你不能做你想做的事,因为你不能改变对象的变量引用。您只能操作该对象。您无法将String对象更改为Float;你只能产生一个从字符串派生的新浮点数。

但是你可以使你的代码少重复:

%w{delivery_fee delivery_free_over delivery_possible_over delivery_range}.each do |k| 
    r[k] = r[k].to_f 
end 
3

这很简单:

h = { one: '1', two: '2' } 

Hash[h.keys.zip(h.values.map(&:to_f))] 
# => { :one => 1.0, :two => 2.0 } 

# or 

Hash[h.map {|k, v| [k, v.to_f] }] 
# => { :one => 1.0, :two => 2.0 } 

这两个使用的一个是偏好的问题,真的。

+0

'+ 1'给你很好的提示! :) –