我发现这个在哈希上使用#any?
的例子有点棘手:
"使用Hash,您可以通过两种方式使用它们。要么是一个参数是键值对的2元素数组。 candidate[0]
是关键,candidate[1]
是其价值。
{:locke => 4, :hugo => 8}.any? { |candidate| candidate[1] > 4 }
返回true,因为第二个候选:hugo
的值大于4
。"
有人能指出我解释这里发生了什么的地方吗?我无法在SO上找到相关问题。非常感谢提前。
答案 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
。
来自官方docs,any?
方法:
将集合的每个元素传递给给定的块。方法 如果块返回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