11

私のコードは次のとおりです。

hash = { two: 2, three: 3 }

def hash_add(hash, new_key, new_value)
  temp_hash = {}

  temp_hash[new_key.to_sym] = new_value
  temp_hash.merge!(hash)
  hash = temp_hash
  puts hash

end

hash_add(hash, 'one', 1)

メソッド内では をputs hash返します{ :one => 1, :two => 2, :three => 3 }が、hash1をメソッドに入れると、その後は変更されません。割り当てが関数の外に出ていないようです。

更新されたハッシュを返し、変更したいハッシュをメソッドの外で設定できると思います。

hash = hash_add(hash, 'one', 1)

しかし、ハッシュに与える割り当てがメソッドの外側に固執しない理由がわかりません。

私はこれを持っています。

def hash_add(hash, new_key, new_value)
  temp_hash = {}

  temp_hash[new_key.to_sym] = new_value
  temp_hash.merge!(hash)
  hash.clear

  temp_hash.each do |key, value|
    hash[key] = value
  end
end

これにより、このメソッドが呼び出されたときに必要なものが得られますが、そのようにハッシュを再構築する必要があるのは少し過剰に思えます。

4

5 に答える 5

2

注: この回答は、Ruby 1.8 がまだ存在していた時代からのものです。

一般に、Ruby のクラスHashは順序付けを提供しません。Ruby のバージョン・実装によって動作が異なる場合があります。

参照:変更されていない場合、反復間でハッシュの順序が保持されますか?

注文したい場合はOrderedHash、ActiveSupport を通じて提供されるクラスを使用する必要があります。

参照: http://apidock.com/rails/ActiveSupport/OrderedHash

于 2013-09-18T21:21:34.310 に答える
0

関数の最後ではputs、ハッシュを返しているだけで、返していません。おそらく、変更puts hashするreturn hashとうまくいくでしょう(私は自分で試したことはありません)。

于 2013-09-18T21:28:13.843 に答える