2011-05-16 66 views
4

有什么区别:如果您使用merge!代替merge红宝石哈希直达VS合并

@attr[:field] = new_value 

@attr.merge(:field => new_value) 
+3

这不是rails专用的,它纯粹是ruby afaik – 2011-05-16 14:52:02

+0

是的,所以常常说Rails有时候我忘了什么是纯Ruby,谢谢。 – eMgz 2011-05-16 15:14:13

回答

7

,没有任何区别。
唯一的区别是您可以在合并参数中使用多个字段(含义:另一个散列)。

例子:

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可读性原因和我想它比合并更快。

您还可以看看哈希的RDoc:http://ruby-doc.org/core/classes/Hash.html#M000759

2

他们做同样的事情,但是:

@attr[:field] = new_value 

更有效,因为没有散穿越是必要的。

0

您可以使用非重合并使用函数式编程风格的哈希。

Ruby的函数式编程有下Don't update variables

不更新哈希

号:

hash = {:a => 1, :b => 2} 
hash[:c] = 3 
hash 

是:

hash = {:a => 1, :b => 2} 
new_hash = hash.merge(:c => 3)