【问题标题】:Block with two parameters有两个参数的块
【发布时间】:2015-11-17 20:11:16
【问题描述】:

我找到了用户 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?我不清楚,因为有时它不起作用。这是重新定义的东西吗?

【问题讨论】:

  • 查看这个答案 - stackoverflow.com/a/1077751/196834
  • 为了清楚起见,find 需要 1 个可选参数和一个块。该块有两个参数。
  • 我是 hirolau,我同意这条消息。

标签: ruby


【解决方案1】:

如果您查看Enumerable#find 的文档,您会发现它只接受一个参数到块。之所以可以发送两个,是因为 Ruby 基于它的“并行分配”结构,可以方便地使用块执行此操作:

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

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

您可以使用块参数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] 这样的数组发送到find 的块,而Ruby 执行并行分配,将1 分配给x,将2 分配给y

另见thisSO问题,它带来了其他强大的并行赋值示例,比如这个语句:

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

【讨论】:

  • 然后我该如何学习“并行赋值”、“分解”以及 Ruby 如何“块语法允许扩展数组元素”我的意思是,我读过几本书和在线教程,但从未读过这个,你能给我一个开始寻找的提示吗?感谢您的回复顺便说一句。
  • 我没有很好的资源给你。我读过的关于 Ruby 的最好的书是 Paolo Perrotta 的“Metaprogramming Ruby”(由 The Pragmatic Programmers 出版),但我刚刚查了一下——它没有提到这些。这是大多数教程中解释的并行分配的一种有用的边缘情况(例如tutorialspoint.com/ruby/ruby_operators.htm)。即使是经验丰富的开发人员也在不断学习该语言中的一些东西,并且您阅读的代码越多,您就会掌握更多技巧。不过,我绝对推荐那本书。易于阅读,您会从中受益匪浅。
【解决方案2】:

find 不带两个参数,只带一个。您示例中的块采用两个参数的原因是因为它使用了破坏。前面的代码a.combination(2) 给出了一个包含两个元素的数组,find 对其进行迭代。每个元素(两个元素的数组)一次作为其单个参数传递给块。但是,当您编写的参数多于实际参数时,Ruby 会尝试通过破坏数组来调整参数。部分:

find{|x, y| x + y == n}

是写作的简写:

find{|(x, y)| x + y == n}

【讨论】:

  • 我相信这是“解构”而不是分解。 +1 提供paren 替代方案。
【解决方案3】:

find 函数迭代元素,它接受一个参数,在本例中是一个块(它接受两个参数作为哈希):

h = {foo: 5, bar: 6}
result = h.find {|k, v| k == :foo && v == 5}
puts result.inspect #=> [:foo, 5]

除非你使用解构,否则该块只接受一个数组参数。

更新:在这种情况下,它似乎正在解构。

【讨论】:

  • 在哈希的情况下,to_a被隐式应用,所以它与数组相同。
  • 是的。我必须承认combination 方法返回了一个哈希值,并想给出一个简单的答案,而不涉及解构之类的东西,但我没有抓住重点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-01
  • 1970-01-01
相关资源
最近更新 更多