如何以最佳方式传递元组参数?
示例:
def foo(...): (Int, Int) = ...
def bar(a: Int, b: Int) = ...
现在我想将foo
的输出传递给bar
。这可以通过以下方式实现:
val fooResult = foo(...)
bar(fooResult._1, fooResult._2)
这种方法看起来有点难看,特别是当我们使用n
处理n > 2
- 元组时。另外,我们必须将foo的结果存储在一个额外的值中,否则foo
必须使用bar(foo._1, foo._2)
多次执行。
有没有更好的方法来传递元组作为参数?
答案 0 :(得分:48)
每种功能都有一种特殊的tupled
方法:
val bar2 = (bar _).tupled // or Function.tupled(bar _)
bar2
采用(Int, Int)
(与bar
个参数相同)的元组。现在你可以说:
bar2(foo())
如果您的方法实际上是函数(请注意val
关键字),语法会更加愉快:
val bar = (a: Int, b: Int) => //...
bar.tupled(foo())
答案 1 :(得分:9)
正如@Tomasz所提到的,使用tupled
是一种很好的方法。
您还可以在分配期间提取从foo
返回的元组:
val (x, y) = foo(5)
bar(x, y)
这样可以获得更干净的代码(无_1
和_2
),并允许您为x
和y
分配描述性名称,使您的代码更易于阅读
答案 2 :(得分:9)
值得了解
foo(...) match { case (a,b) => bar(a,b) }
作为替代方案,不要求您明确创建临时fooResult
。当速度和缺乏混乱都很重要时,这是一个很好的妥协。您可以使用bar _
创建一个函数,然后将其转换为带有.tupled
的单个元组参数,但每次调用该对时,这会创建两个新的函数对象;你可以存储结果,但这可能会不必要地混乱你的代码。
对于日常使用(即这不是代码的性能限制部分),您可以
(bar _).tupled(foo(...))
排队。当然,你创建了两个额外的函数对象,但你很可能也只是创建了元组,所以你不在乎那个,对吗?