[英]Decomposing tuples in function arguments
在 python 中我可以这样做:
def f((a, b)):
return a + b
d = (1, 2)
f(d)
这里传入的元组在传递给f
时被分解。
现在在scala中我正在这样做:
def f(ab: (Int, Int)): Int = {
val (a, b) = ab
a + b
}
val d = (1, 2)
f(d)
我可以在这里做些什么,以便在传入参数时进行分解吗? 只是好奇。
您可以创建一个函数并将其输入与模式匹配相匹配:
scala> val f: ((Int, Int)) => Int = { case (a,b) => a+b }
f: ((Int, Int)) => Int
scala> f(1, 2)
res0: Int = 3
或者用match
关键字匹配方法的输入:
scala> def f(ab: (Int, Int)): Int = ab match { case (a,b) => a+b }
f: (ab: (Int, Int))Int
scala> f(1, 2)
res1: Int = 3
另一种方法是使用带有两个参数的函数并将其“元组化”:
scala> val f: (Int, Int) => Int = _+_
f: (Int, Int) => Int = <function2>
scala> val g = f.tupled // or Function.tupled(f)
g: ((Int, Int)) => Int = <function1>
scala> g(1, 2)
res10: Int = 3
// or with a method
scala> def f(a: Int, b: Int): Int = a+b
f: (a: Int, b: Int)Int
scala> val g = (f _).tupled // or Function.tupled(f _)
g: ((Int, Int)) => Int = <function1>
scala> g(1, 2)
res11: Int = 3
// or inlined
scala> val f: ((Int,Int)) => Int = Function.tupled(_+_)
f: ((Int, Int)) => Int = <function1>
scala> f(1, 2)
res12: Int = 3
从Scala 3
开始,具有改进tupled function
功能:
// val tuple = (1, 2)
// def f(a: Int, b: Int): Int = a + b
f.tupled(tuple)
// 3
在Scastie中使用它
object RandomExperiments extends App{
def takeTuple(t:(Int,Int))=print (s"$t ${t._1}\n")
takeTuple(1,3)
takeTuple((1,3))
takeTuple(((1,3)))
}
印刷:
(1,3) 1
(1,3) 1
(1,3) 1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.