这两者有什么区别吗:
@attr[:field] = new_value
并且
@attr.merge(:field => new_value)
这两者有什么区别吗:
@attr[:field] = new_value
并且
@attr.merge(:field => new_value)
merge!
而不是merge
,两者没有区别。例如:
h1 = { "a" => 100, "b" => 200 }
h2 = { "b" => 254, "c" => 300 }
h3 = h1.merge(h2)
puts h1 # => {"a" => 100, "b" => 200}
puts h3 # => {"a"=>100, "b"=>254, "c"=>300}
h1.merge!(h2)
puts h1 # => {"a"=>100, "b"=>254, "c"=>300}
在分配单个值时,我更喜欢使用h[:field] = new_val
而不是使用merge
,因为它易于阅读,而且我猜它比合并更快。
您还可以查看Hash-rdoc:http://ruby-doc.org/core/classes/Hash.html#M000759
它们做的事情相同,但是:
@attr[:field] = new_value
这种方法更有效率,因为不需要遍历哈希表。
Merge 返回一个新的哈希,将 other_hashes 合并到 self 的不同位置, 但是 Merge! 的操作类似于 "update",返回 self 哈希,在 self 位置进行复制。
h1 = { "a": 1 }
h2 = { "b": 2 }
def merge_hash (h1,h2)
puts h1 # {:a=> 1}
puts h1.object_id # 340720
h1 = h1.merge(h2)
puts h1 # {:a=>1, :b=>2}
puts h1.object_id # 340760
end
merge_hash(h1, h2)
puts h1 # {:a=>1}
puts h1.object_id # 340720
def merge_hash (h1,h2)
puts h1 # {:a=>1}
puts h1.object_id # 340720
h1 = h1.merge!(h2)
puts h1 # {:a=>1, :b=>2}
puts h1.object_id # 340720
end
merge_hash(h1, h2)
puts h1 # {:a=>1, :b=>2}
puts h1.object_id # 340720
您可以使用非惊叹号合并来在函数式编程风格中使用哈希表。
Ruby函数式编程有以下内容不要更新变量
不要更新哈希表
错误的做法:
hash = {:a => 1, :b => 2}
hash[:c] = 3
hash
Yes:
hash = {:a => 1, :b => 2}
new_hash = hash.merge(:c => 3)