我发现用户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
等预定义方法?我不清楚,因为有时它不起作用。这是重新定义的东西吗?
答案 0 :(得分:6)
如果查看 public boolean exists() {
SecurityManager security = System.getSecurityManager();
if (security != null) {
security.checkRead(path);
}
return ((fs.getBooleanAttributes(this) & FileSystem.BA_EXISTS) != 0);
}
public void checkRead(FileDescriptor fd) {
if (fd == null) {
throw new NullPointerException("file descriptor can't be null");
}
checkPermission(new RuntimePermission("readFileDescriptor"));
}
的文档,您会发现它只接受块的一个参数。您之所以可以发送两个,是因为Ruby可以方便地使用块来实现,基于它的“并行分配”结构:
Enumerable#find
基本上,每个都会为块生成一个数组元素,并且因为Ruby块语法允许通过提供参数列表将数组元素“扩展”到它们的组件,所以它可以工作。
您可以使用块参数here找到更多技巧。
[[1,2,3], [4,5,6]].each {|x,y,z| puts "#{x}#{y}#{z}"}
# 123
# 456
产生一个数组数组,其中每个子数组由2个元素组成。所以:
a.combination(2)
结果,您发送了一个像a = [1,2,3,4]
a.combination(2)
# => [[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]]
这样的数组来查找块,Ruby执行并行赋值,将1分配给[1,2]
,将2分配给x
。
另见this SO问题,其中提供了其他强大的并行分配示例,例如此声明:
y
答案 1 :(得分:3)
find
不带两个参数,需要一个参数。示例中的块有两个参数的原因是因为它使用了destroy。前面的代码a.combination(2)
给出了两个元素的数组数组,find
遍历它。每个元素(两个元素的数组)一次传递给块作为其单个参数。但是,当您编写更多参数时,Ruby会尝试通过破坏数组来调整参数。部分:
find{|x, y| x + y == n}
是写作的简写:
find{|(x, y)| x + y == n}
答案 2 :(得分:0)
find
函数迭代元素,它接受一个参数,在这种情况下是一个块(它确实为哈希采用两个参数):
h = {foo: 5, bar: 6}
result = h.find {|k, v| k == :foo && v == 5}
puts result.inspect #=> [:foo, 5]
除非你使用解构,否则该块只为数组提供一个参数。
更新:在这种情况下似乎是解构。