我们如何实现“就地”转换为哈希值的浮点数?动机不必像这样编写一堆代码
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
答案 0 :(得分:3)
您无法执行您想要的操作,因为您无法更改变量引用的对象。您只能操纵对象。您无法将String
对象更改为Float
;你只能生成一个从字符串派生的新浮点数。
但是你可以减少重复的代码:
%w{delivery_fee delivery_free_over delivery_possible_over delivery_range}.each do |k|
r[k] = r[k].to_f
end
答案 1 :(得分: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 }
两者中哪一个使用是一个偏好的问题,真的。
答案 2 :(得分: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}