如何在哈希的开头添加键/值对?

时间:2013-09-18 21:11:48

标签: ruby hash

我的代码是:

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

在调用此方法时,这给了我想要的东西,但是这样重建哈希似乎有点过分了。

5 个答案:

答案 0 :(得分:13)

这个怎么样?

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}

答案 1 :(得分:7)

Ruby通过值将对象传递给方法,但该值是对象的引用,因此当您在hash=temp_hash方法中设置add_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

在“Is Ruby pass by reference or by value?

中有一些关于传递值的好图表

答案 2 :(得分:1)

注意:当Ruby 1.8还在时,这个答案已经过时了。

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

另请参阅:Hash ordering preserved between iterations if not modified?

如果您想要订购,则需要使用通过ActiveSupport提供的课程OrderedHash

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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