gpt4 book ai didi

ruby - 具有两个参数的 block

转载 作者:数据小太阳 更新时间:2023-10-29 07:12:40 26 4
gpt4 key购买 nike

我从用户 Hirolau 那里找到了这段代码:

def sum_to_n?(a, n)
a.combination(2).find{|x, y| x + y == n}
end

a = [1, 2, 3, 4, 5]
sum_to_n?(a, 9) # => [4, 5]
sum_to_n?(a, 11) # => nil

我如何知道何时可以将两个参数发送到预定义方法(如 find)?我不清楚,因为有时它不起作用。这是重新定义的东西吗?

最佳答案

如果您查看Enumerable#find 的文档,您会发现它只接受一个 block 参数。您可以将它发送两次的原因是因为 Ruby 可以方便地让您根据它的“并行赋值”结构使用 block 来执行此操作:

[[1,2,3], [4,5,6]].each {|x,y,z| puts "#{x}#{y}#{z}"}
# 123
# 456

所以基本上,每个 block 都会产生一个数组元素,并且因为 Ruby block 语法允许通过提供参数列表将数组元素“扩展”到它们的组件,所以它起作用了。

您可以使用 block 参数 here 找到更多技巧。

a.combination(2) 产生一个数组数组,其中每个子数组由 2 个元素组成。所以:

a = [1,2,3,4]
a.combination(2)
# => [[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]]

因此,您发送了一个数组,如 [1,2] 到查找 block ,Ruby 执行并行赋值,将 1 赋值给 x,将 2 赋值给

另请参阅 this SO 问题,它带来了并行赋值的其他强大示例,例如以下语句:

a,(b,(c,d)) = [1,[2,[3,4]]]

关于ruby - 具有两个参数的 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33766082/

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