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

16

这个怎么样?

hash1 = { two: 2, three: 3 }

#add a new key,value 
hash1 = Hash[:one,1].merge!(hash1) #=> {:one=>1, :two=>2, :three=>3}

示例 #2:

h = { two: 2, three: 3 }

def hash_add(h,k,v)
  Hash[k.to_sym,v].merge!(h)
end

h = hash_add(h, 'one', 1) #=> {:one=>1, :two=>2, :three=>3}
于 2013-09-18T21:21:26.533 回答
7

Ruby 通过值将对象传递给方法,但值是对对象的引用,因此当您hash=temp_hashadd_hash方法中设置时,该更改仅适用于方法内部。方法外的 hash 值不变。

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
  hash
end
h2 = hash_add(hash, 'one', 1)
hash
=> {:two=>2, :three=>3}
h2
=>{:one=>1, :two=>2, :three=>3}

如果要更新散列,则需要替换散列的内容,而不是像清除并重新添加值那样将散列重新指向新对象。您也可以使用该replace方法进行操作。

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

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

“ Ruby 是按引用传递还是按值传递? ”中有一些关于按值传递的好图。

于 2013-09-18T21:48:08.123 回答
2

注意:这个答案在 Ruby 1.8 还存在的时候就已经很老了。

通常,HashRuby 中的类不提供排序。Ruby 版本/实现之间的行为可能有所不同。

另请参阅:如果未修改,则在迭代之间保留哈希排序?

如果你想订购,你需要使用OrderedHash通过 ActiveSupport 提供的类

请参阅:http ://apidock.com/rails/ActiveSupport/OrderedHash

于 2013-09-18T21:21:34.310 回答
0

在函数结束时,您只是在putsing 哈希,而不是返回它。也许如果您更改puts hashreturn hash它会起作用(我自己没有尝试过)。

于 2013-09-18T21:28:13.843 回答
0

temp_hash是一个局部变量,一旦函数返回就会被删除。

于 2013-09-18T21:30:26.250 回答