{:x => 1}和{:x => 1,:y => nil}在红宝石之间有什么区别吗?

Kio*_*ong 4 ruby null

编辑:

在这里,有很多很棒的答案,直到我不知道选择哪个作为“答案”。根据评论建议,该问题应标记为“主题外”。因此,很抱歉,我不会选择答案,如果其他人有相同的问题,我将在此保留。


之间有什么区别:

(1)

a = {
  :x => 1
}
Run Code Online (Sandbox Code Playgroud)

(2)

b = {
  :x => 1,
  :y => nil
}
Run Code Online (Sandbox Code Playgroud)

考虑到:(1),a[:y] returns nil 而对于(2),b[:y] returns nil以及


我看到的唯一区别是当我输出时:

(1)

{
  :x => 1
}
Run Code Online (Sandbox Code Playgroud)

和(2)

{
  :x => 1
  :y => nil
}
Run Code Online (Sandbox Code Playgroud)

mrz*_*asa 5

有几个区别。让我描述两个,让您知道在哪里看:

Hash#fetch 如果不存在密钥,则会引发错误(或调用提供的块):

a.fetch(:y)
# >> KeyError: key not found: :y
> a.fetch(:y){ "100" }
# => "100"
b.fetch(:y)
# => nil
b.fetch(:y){ "100" }
# => nil
Run Code Online (Sandbox Code Playgroud)

Hash#map(以及所有其他迭代器)将具有nil值的密钥考虑在内:

a.map{|k, v| [k, v]}
# => [[:x, 1]]
b.map{|k, v| [k, v]}
# => [[:x, 1], [:y, nil]]
Run Code Online (Sandbox Code Playgroud)

  • 这两个对象几乎在各个方面都有不同的表现。命名相似性实际上要困难得多! (2认同)