【问题标题】:Strange Ruby group_by and select behavior奇怪的 Ruby group_by 和选择行为
【发布时间】:2012-08-31 15:59:51
【问题描述】:

当我尝试从使用group_by 创建的哈希中select 时,我遇到了奇怪的行为:

当我跑步时

all_records.group_by(&:opportunity).map{|foo| foo[1].length != 1 }.select{|x| x}

我找回了一些元素:=> [true, true]

然而,当我尝试选择时,我的确切块是 mapped:

all_records.group_by(&:opportunity).select{|foo| foo[1].length != 1 }

我没有得到任何结果:=> {}

作为一个健全性检查,当我第一次使用 sort 将哈希转换为数组时,它按预期工作:

all_records.group_by(&:opportunity).sort.select{|foo| foo[1].length != 1 }.length

结果:=> 2

这对我来说很奇怪,因为第一个结果表明哈希完美地识别了foo[1] 命令。这是什么原因造成的?

【问题讨论】:

    标签: ruby arrays select filter


    【解决方案1】:

    在第一个 sn-p 中,您正在对哈希执行 Enumerable#map,其中包含一个获取单个参数的块(为什么不解压缩它?),在这里您得到一对(如您所料) .在第二个 sn-p 中,您再次使用单个参数执行 Hash#select(您应该再次解压缩键/值),但在这里您只得到键,而不是对(因为方法是如何实现的,详情请查看源代码)。

    >> {a: 1, b: 2}.map { |x| p x }
    [:a, 1]
    [:b, 2]
    >> {a: 1, b: 2}.select { |x| p x }
    :a
    :b
    

    如果您访问Hash#select 的文档,您会看到它明确需要解压缩参数。结论:使用任何方法迭代哈希时总是解包键/值:

    records.group_by(&:opportunity).select { |key, values| values.length > 1 }
    

    【讨论】:

      猜你喜欢
      • 2016-08-29
      • 1970-01-01
      • 1970-01-01
      • 2013-01-29
      • 2014-05-28
      • 1970-01-01
      • 2018-11-18
      • 1970-01-01
      • 2011-08-19
      相关资源
      最近更新 更多