在Ruby中使用<<追加键/值对来哈希

jca*_*pio 72 ruby hash

在Ruby中,可以使用<<将值附加到现有数组:

a = []
a << "foo"
Run Code Online (Sandbox Code Playgroud)

但是,您是否还可以将键/值对附加到现有哈希?

h = {}
h << :key "bar"
Run Code Online (Sandbox Code Playgroud)

我知道你可以这样做:

h[:key] = ""
h[:key] << "bar"
Run Code Online (Sandbox Code Playgroud)

但那不是我想要的.

谢谢.

saw*_*awa 129

merge!.

h = {}
h.merge!(key: "bar")
# => {:key=>"bar"}
Run Code Online (Sandbox Code Playgroud)

  • 区别在于:`store`只是添加了一对新的,它不关心密钥是否已经存在.使用`merge!`但是,重写具有重复键的条目,因此该方法不仅仅是添加对.如果你对这两者进行基准测试,你会发现`store`更快(但是特别是在小哈希上) (5认同)
  • 我认为`merge !`不仅仅是创建一个新的键/值对,因为它实际上用于其他目的. (3认同)
  • @jcarpio谢谢.`Hash#merge!`返回接收器哈希,就像`Array#<<`返回接收器数组一样.`哈希#store`是一个完全不同的东西.另外,在参数位置使用哈希语法sugar`key:"bar"`,我认为这是你能得到的最接近你的符号.我知道这个更接近你想要的. (2认同)

Mar*_*mas 76

由于散列本身并不是有序的,因此没有附加的概念.但是,1.9以来的Ruby哈希值维持了插入顺序.以下是添加新键/值对的方法.

最简单的解决方案是

h[:key] = "bar"
Run Code Online (Sandbox Code Playgroud)

如果您想要一个方法,请使用store:

h.store(:key, "bar")
Run Code Online (Sandbox Code Playgroud)

如果你真的,真的想使用"铲"运算符(<<),它实际上是将哈希值作为数组附加,你必须指定键:

h[:key] << "bar"
Run Code Online (Sandbox Code Playgroud)

以上仅在密钥存在时有效.要附加新密钥,您必须使用默认值初始化哈希值,您可以这样做:

h = Hash.new {|h, k| h[k] = ''}
h[:key] << "bar"
Run Code Online (Sandbox Code Playgroud)

你可能想要修补Hash,以包括一个以你编写的方式工作的铲子操作符:

class Hash
  def <<(k,v)
    self.store(k,v)
  end
end
Run Code Online (Sandbox Code Playgroud)

但是,这并没有继承在其他环境中应用于铲运算符的"语法糖":

h << :key, "bar" #doesn't work
h.<< :key, "bar" #works
Run Code Online (Sandbox Code Playgroud)


Per*_*heo 25

不,我认为你不能追加键/值对.我所知道的唯一最接近的是使用该store方法:

h = {}
h.store("key", "value")
Run Code Online (Sandbox Code Playgroud)