如何以最佳方式传递元组参数?

时间:2012-09-01 19:25:01

标签: scala arguments tuples

如何以最佳方式传递元组参数?

示例:

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)多次执行。

有没有更好的方法来传递元组作为参数?

3 个答案:

答案 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),并允许您为xy分配描述性名称,使您的代码更易于阅读

答案 2 :(得分:9)

值得了解

foo(...) match { case (a,b) => bar(a,b) }

作为替代方案,不要求您明确创建临时fooResult。当速度和缺乏混乱都很重要时,这是一个很好的妥协。您可以使用bar _创建一个函数,然后将其转换为带有.tupled的单个元组参数,但每次调用该对时,这会创建两个新的函数对象;你可以存储结果,但这可能会不必要地混乱你的代码。

对于日常使用(即这不是代码的性能限制部分),您可以

(bar _).tupled(foo(...))

排队。当然,你创建了两个额外的函数对象,但你很可能也只是创建了元组,所以你不在乎那个,对吗?

相关问题