Ruby哈希表直接访问与合并

6

这两者有什么区别吗:

@attr[:field] = new_value

并且

@attr.merge(:field => new_value)

3
据我所知,这与 Rails 无关,纯属 Ruby。 - Gabriel Ščerbák
是的,我经常说Rails,有时候会忘记什么是纯Ruby,谢谢。 - eMgz
4个回答

9
如果你使用的是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


3

它们做的事情相同,但是:

@attr[:field] = new_value

这种方法更有效率,因为不需要遍历哈希表。


1

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

太棒了!这正是我在寻找的东西。 - rushikesh

0

您可以使用非惊叹号合并来在函数式编程风格中使用哈希表。

Ruby函数式编程有以下内容不要更新变量

不要更新哈希表

错误的做法:

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

Yes:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接