2013-01-21 113 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'給你很好的提示! :) –