函数声明中的 Scala 元组提取
Scala tuple extraction in function declaration
例如 Tuple2
形式
type Duple = (String,Int)
此函数在参数中提取和标记 duple 的项目时出错,
def f( (s,n): Duple ): String = s*n
但是这行得通,
def f( d: Duple ): String = {
val (s,n) = d
s*n
}
是否有比这种声明式方法更短的形式来提取和标记函数中的元组项?
def f(d: Duple): String = d._1 * d._2
def f(d: Duple): String = d match { case (x, y) => x * y }
从常规的 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>
用元组参数调用它:
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
例如 Tuple2
形式
type Duple = (String,Int)
此函数在参数中提取和标记 duple 的项目时出错,
def f( (s,n): Duple ): String = s*n
但是这行得通,
def f( d: Duple ): String = {
val (s,n) = d
s*n
}
是否有比这种声明式方法更短的形式来提取和标记函数中的元组项?
def f(d: Duple): String = d._1 * d._2
def f(d: Duple): String = d match { case (x, y) => x * y }
从常规的 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>
用元组参数调用它:
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