gpt4 book ai didi

ruby - Ruby Array #count 如何处理多个 block 参数

转载 作者:太空宇宙 更新时间:2023-11-03 17:06:24 24 4
gpt4 key购买 nike

当我执行以下操作时:

[[1,1], [2,2], [3,4]].count {|a,b| a != b} # => 1

block 参数ab分别赋给每个内部数组的第一个和第二个值。我不明白这是如何完成的。

Array#countEnumerable#count 文档中给出的唯一示例使用了一个 block 参数:

ary.count {|x| x % 2 == 0} # => 3

最佳答案

就像作业一样,有一个(不太) secret 的捷径。如果右边是一个数组,左边有多个变量,则数组是splatted的,所以下面两行是一样的:

a, b, c = [1, 2, 3]
a, b, c = *[1, 2, 3]

虽然不是一回事,但当产生的值是一个数组并且有多个参数时, block 具有相同的东西。因此,当您 yield [1, 2, 3] 时,这两个 block 的行为相同:

do |a, b, c|
...
end

do |(a, b, c)|
...
end

因此,在您的情况下,值被解构,就好像您这样写:

[[1,1], [2,2], [3,4]].count {|(a,b)| a != b} # => 1

如果您有另一个值与数组一起传递,则必须明确指定结构,因为数组的解构不会按照我们想要的方式自动进行:

[[1,1], [2,2], [3,4]].each.with_index.count {|e,i| i + 1 == e[1] }
# automatic deconstruction of [[1,1],0]:
# e=[1,1]; i=0

[[1,1], [2,2], [3,4]].each.with_index.count {|(a,b),i| i + 1 == b }
# automatic deconstruction of [[1,1],0], explicit deconstruction of [1,1]:
# a=1; b=1; i=0

[[1,1], [2,2], [3,4]].each.with_index.count {|a,b,i| i + 1 == b }
# automatic deconstruction of [[1,1],0]
# a=[1,1]; b=0; i=nil
# NOT what we want

关于ruby - Ruby Array #count 如何处理多个 block 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54067371/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com