在scala中的函数参数中提取元组的快捷方式

时间:2014-10-26 23:02:26

标签: scala

val list = List((1,2), (3,4))

list.map(tuple => {
  val (a, b) = tuple
  do_something(a,b)
})

// the previous can be shortened as follows
list.map{ case(a, b) =>
  do_something(a,b)
}

// similarly, how can I shorten this (and avoid declaring the 'tuple' variable)?
def f(tuple: (Int, Int)) {
  val (a, b) = tuple
  do_something(a,b)
}

// here there two ways, but still not very short,
// and I could avoid declaring the 'tuple' variable
def f(tuple: (Int, Int)) {
  tuple match {
    case (a, b) => do_something(a,b)
  }
}

def f(tuple: (Int, Int)): Unit = tuple match {
  case (a, b) => do_something(a,b)
}

4 个答案:

答案 0 :(得分:2)

使用tupled

scala> def doSomething = (a: Int, b: Int) => a + b
doSomething: (Int, Int) => Int

scala> doSomething.tupled((1, 2))
res0: Int = 3

scala> def f(tuple: (Int, Int)) = doSomething.tupled(tuple)
f: (tuple: (Int, Int))Int

scala> f((1,2))
res1: Int = 3

scala> f(1,2) // this is due to scala auto-tupling
res2: Int = 3

tupled是为FunctionN的每个N >= 2定义的,并返回一个期望包含在元组中的参数的函数。

答案 1 :(得分:0)

虽然这可能看起来像一个微不足道的建议,但只需在元组上使用f_1即可进一步简化_2函数。

def f(tuple: (Int, Int)): Unit = 
    do_something(tuple._1, tuple._2)

显然,这样做会影响可读性(有关元组第1和第2个参数意义的一些元信息被删除),你是否希望在{{{}的其他地方使用元组的元素? 1}}方法,您需要再次提取它们。

虽然对于许多用途而言,这可能仍然是最简单,最短和最直观的选择。

答案 2 :(得分:0)

如果我理解正确,你试图将一个元组传递给一个带有2个args的方法?

def f(tuple: (Int,Int)) = do_something(tuple._1, tuple._2)

答案 3 :(得分:0)

  

更易读,我的意思是给出变量名而不是在元组上使用_1和_2

在这种情况下,使用case类而不是元组是个好主意,特别是因为它只需要一行:

case class IntPair(a: Int, b: Int)

def f(pair: IntPair) = do_something(pair.a, pair.b)

如果从无法更改的外部代码中获取(Int, Int)(或者您不想更改),则可以添加从元组转换为IntPair的方法。

另一种选择:{(a: Int, b: Int) => a + b}.tupled.apply(tuple)。不幸的是,{case (a: Int, b: Int) => a + b}.apply(tuple)不起作用。