代码之家  ›  专栏  ›  技术社区  ›  Mladen Jablanović

为什么hash.new()隐藏hash成员?[复制品]

  •  12
  • Mladen Jablanović  · 技术社区  · 15 年前

    好的,所以我想创建一个散列,它的默认值是空散列。有点奇怪,我知道,但我认为它可能有用。

    我是这样做的:

    >> a = Hash.new({})
    => {}
    >> a[:a][:b] = 5
    => 5
    >> a
    => {}
    >> a[:a]
    => {:b=>5}
    >> a.keys
    => []
    >> a.size
    => 0
    >> a[:a].size
    => 1
    

    换句话说,我在检查哈希时看不到哈希成员,但我可以通过它的键访问它。

    这是预期行为吗?这是怎么回事?

    顺便说一句,这是Ruby1.9.1,还没有尝试过早期的版本。

    编辑:简化的例子,因为它不必是哈希的哈希…

    1 回复  |  直到 15 年前
        1
  •  17
  •   sepp2k    15 年前

    它是预期的行为(在所有Ruby版本中)。如果你再做一点实验,你会发现无论你用的是哪个键,你总是能访问相同的散列值:

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

    使用默认参数hash.new的工作方式是:如果这样做 hash[key] 它检查哈希中是否存在该键。如果是,则返回该键的值。如果不是,则返回默认值。它不向哈希添加键,每次都将返回相同的默认对象(不是副本)。

    要得到您想要的,您需要指定一个默认块。这样,每次访问不在哈希中的键时都会执行该块。在该块中,您可以创建一个新的哈希,并将键设置为“指向”该哈希。像这样:

    Hash.new { |h,k|  h[k] = {} }