将哈希看作数组?

时间:2016-01-24 21:19:52

标签: arrays ruby hash

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

"使用Hash,您可以通过两种方式使用它们。要么是一个参数是键值对的2元素数组。 candidate[0]是关键,candidate[1]是其价值。

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

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

有人能指出我解释这里发生了什么的地方吗?我无法在SO上找到相关问题。非常感谢提前。

2 个答案:

答案 0 :(得分:3)

如果您打印候选人,将很容易理解:

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

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

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

来自官方docsany?方法:

  

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

答案 1 :(得分:1)

Hash#any?对给定块的两个元素的yield数组的作用是true,如果对块的评估返回了真实的(false或{{nil 1}})和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