【发布时间】:2015-05-13 06:29:29
【问题描述】:
例如给定一个Tuple2 的形式
type Duple = (String,Int)
这个函数错误地提取和标记参数中的重复项,
def f( (s,n): Duple ): String = s*n
不管怎样,
def f( d: Duple ): String = {
val (s,n) = d
s*n
}
有没有比这种声明性方法更短的形式来提取和标记函数中的元组项?
【问题讨论】:
例如给定一个Tuple2 的形式
type Duple = (String,Int)
这个函数错误地提取和标记参数中的重复项,
def f( (s,n): Duple ): String = s*n
不管怎样,
def f( d: Duple ): String = {
val (s,n) = d
s*n
}
有没有比这种声明性方法更短的形式来提取和标记函数中的元组项?
【问题讨论】:
从一个常规的 2 arg 函数开始:
scala> val f: (String, Int) => String = (a, b) => a * b
f: (String, Int) => String = <function2>
将其转换为接受元组的单个 arg 函数:
scala> val tf = f tupled
tf: ((String, Int)) => String = <function1>
使用元组 arg 调用它:
scala> tf("a" -> 2)
res0: String = aa
或者如果你走相反的方向:
从一个接受元组的函数开始:
scala> tf
res2: ((String, Int)) => String = <function1>
将其转换为需要 2 个参数的函数:
scala> val uf = Function.untupled(tf)
uf: (String, Int) => String = <function2>
用 2 个参数调用它:
scala> uf("b", 3)
res3: String = bbb
【讨论】:
def f(d: Duple): String = d._1 * d._2
def f(d: Duple): String = d match { case (x, y) => x * y }
【讨论】: