阻止两个参数

时间:2015-11-17 20:11:17

标签: ruby

我发现用户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等预定义方法?我不清楚,因为有时它不起作用。这是重新定义的东西吗?

3 个答案:

答案 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]

除非你使用解构,否则该块只为数组提供一个参数。

更新:在这种情况下似乎是解构。