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

时间:2019-07-25 06:18:50

标签: ruby null

两者之间是否有区别

(1)

a = {
  :x => 1
}

(2)

b = {
  :x => 1,
  :y => nil
}

鉴于(1),a[:y] returns nil 对于(2),b[:y] returns nil也是如此


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

(1)

{
  :x => 1
}

还有(2)

{
  :x => 1
  :y => nil
}

3 个答案:

答案 0 :(得分: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

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

a.map{|k, v| [k, v]}
# => [[:x, 1]]
b.map{|k, v| [k, v]}
# => [[:x, 1], [:y, nil]]

答案 1 :(得分:3)

是的,哈希具有不同数量的对。 hsh.keys将返回[:x, :y]

答案 2 :(得分:0)

两个哈希都返回:x:y键的nil值,因为它们被配置为在找不到键时返回nil。这是Ruby中的默认行为。

但是,您可以在初始化哈希时更改该行为

c = Hash.new("foo")
c[:x] = 1
c[:x]
# => 1
c[:y]
# => "foo"