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
4

3 に答える 3

5

これは簡単:

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 }

どちらを使用するかは、実際には好みの問題です。

于 2013-01-21T01:53:35.883 に答える
3

変数が参照するオブジェクトを変更できないため、やりたいことができません。オブジェクトのみを操作できます。StringオブジェクトをFloat;に変更することはできません。文字列から派生した新しいfloatのみを生成できます。

ただし、コードの繰り返しを少なくすることができます。

%w{delivery_fee delivery_free_over delivery_possible_over delivery_range}.each do |k|
  r[k] = r[k].to_f
end
于 2013-01-21T00:56:10.273 に答える
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}
于 2013-01-21T00:56:19.357 に答える