【问题标题】:Looking at a hash as an array?将哈希视为数组?
【发布时间】:2016-01-24 21:19:52
【问题描述】:

我发现这个在哈希上使用#any? 的例子有点棘手:

“使用哈希,您可以通过两种方式使用它们。或者使用一个参数,即键值对的 2 元素数组。candidate[0] 是键,candidate[1] 是它的值。

{:locke => 4, :hugo => 8}.any? { |candidate| candidate[1] > 4 } 

这会返回 true,因为第二个候选 :hugo 的值大于 4。"

谁能给我指出一个地方来解释这里发生了什么?我找不到关于 SO 的相关问题。提前非常感谢。

【问题讨论】:

    标签: arrays ruby hash


    【解决方案1】:

    如果你打印候选,它会变得很容易理解:

    {:locke => 4, :hugo => 8}.any? { |candidate| puts candidate.to_s } 
    # [:locke, 4]
    # [:hugo, 8]
    

    any? 方法将散列的每个键值对视为一个二元素数组,这意味着散列将被视为一个数组数组

    如果第二个元素(即 4 和 8)中的任何一个曾经是 > 4,则传递给 any?(即 { |candidate| candidate[1] > 4 })的块返回 true,否则返回 false8 > 4,所以结果是true

    来自官方docsany?方法:

    将集合的每个元素传递给给定的块。方法 如果块曾经返回 false 以外的值,则返回 true 或 零。如果没有给出块,Ruby 会添加一个 { |obj| 的隐式块 obj } 会导致什么?如果至少其中一个返回 true 集合成员不为 false 或 nil。

    【讨论】:

      【解决方案2】:

      Hash#any? 所做的是将包含两个元素的 yield 数组放入给定块,如果块的评估返回真实值(不是 falsenil),则返回 true,否则返回 false

      至于为什么如果你传递一个带有两个参数的块你会得到两个值 - 这被称为unpacking

      def foo
        yield [42, 6 * 9]
      end
      
      # only one argument, array is not unpacked
      foo { |numbers| p numbers } # prints [42, 54]
      
      # two arguments, the array is being unpacked
      foo { |x, y| p x, y }       # prints 42 \n 54
      

      【讨论】:

        猜你喜欢
        • 2012-10-29
        • 2019-10-27
        • 2017-05-11
        • 2019-05-23
        • 2015-07-24
        • 1970-01-01
        • 2010-12-11
        • 2015-11-26
        • 1970-01-01
        相关资源
        最近更新 更多