36

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

例子:

def foo(...): (Int, Int) = ...

def bar(a: Int, b: Int) = ...

现在我想传递 to 的foo输出bar。这可以通过以下方式实现:

val fooResult = foo(...)
bar(fooResult._1, fooResult._2)

这种方法看起来有点难看,尤其是当我们处理带有 的n-tuple 时n > 2。此外,我们必须将 foo 的结果存储在一个额外的值中,因为否则foo必须使用bar(foo._1, foo._2).

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

4

3 回答 3

54

每个函数都有一个特殊的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())

也可以看看

于 2012-09-01T19:29:57.093 回答
10

也值得了解

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

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

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

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

排队。当然,您创建了两个额外的函数对象,但您很可能也刚刚创建了元组,所以您并不关心那么多,对吧?

于 2012-09-01T20:57:33.220 回答
9

tupled正如@Tomasz 所提到的,使用 是一种好方法。

您还可以提取foo分配期间返回的元组:

val (x, y) = foo(5)
bar(x, y)

这样做的好处是代码更简洁(没有_1and ),并允许您为and_2分配描述性名称,从而使您的代码更易于阅读。xy

于 2012-09-01T19:35:04.413 回答