【问题标题】:Hash.new{[]} - anything wrong with it?Hash.new{[]} - 有什么问题吗?
【发布时间】:2012-03-03 20:42:25
【问题描述】:

查看@mu is too short's answer to another question,我尝试了一个变体:

def anagrams(list)
  h = Hash.new{ [] }
  list.each_with_object(h){ |el, h| h[el.downcase.chars.sort] <<= el }
end

anagrams(['cars', 'for', 'potatoes', 'racs', 'four','scar', 'creams', 'scream'])

(盲目地假设会有一个&lt;&lt;= 运算符。)它可以工作,但Hash.new{[]} 根本不是惯用的 - 我没有找到任何例子。有什么问题吗?

【问题讨论】:

  • 必须是Hash.new([])Hash.new {|h, k| ... }
  • @selman: 不,我的意思是块形式(没有 |h,k|),这就是重点。
  • 你检查 ruby​​specs 了吗?
  • @selman: Hash.new([]) 也会产生令人惊讶的结果。
  • @NiklasB.:但是不同令人惊讶的结果。

标签: ruby hashmap block


【解决方案1】:

这种代码不常用的原因是它没有在哈希中插入返回值,因此用户需要调用 Hash#[]= 将对象插入到哈希中(这就是你的在这里重新做: hash[key] 的缩写

【讨论】:

    【解决方案2】:

    奇怪,因为它没有使用块 ctor 提供的任何东西,但块 ctor 的目的是返回默认值——如果你选择不做任何事情|h, k|,这就是你的电话。

    【讨论】:

    • 实际上忽略参数会导致令人惊讶的行为,即如果缺少键,将返回一个值,但它没有保存在哈希中!所以h[:foo]会返回一个空列表,h[:foo] &lt;&lt; 1不会报错,但是结果会立即被丢弃,h[:foo]下一次会再次返回[]
    • @NiklasB。文档明确声明它不会保存在哈希中,除非该块这样做(至少在 apidock.com 上)。
    • 是的,这就是为什么使用Hash.new { [] } 不是一个好主意的原因。它似乎做了一些与实际不同的事情。
    • @Niklas B. 这可能是件好事。如果您只想知道 h[:not_a_key] 的字谜,标准方法会增加散列。但是h[:not_a_key] &lt;&lt; 1 被默默地丢弃无疑是一个很好的论据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-15
    相关资源
    最近更新 更多