如何调用带有Tuple2的2个参数的函数?

ssa*_*anj 10 scala tuples

我有这样的功能:

def print(name:String, surname:String) { println(name + " " + surname) }
Run Code Online (Sandbox Code Playgroud)

我也有一个Tuple2:

val johnsmith = ("John", "Smith")
Run Code Online (Sandbox Code Playgroud)

当我用johnsmith调用print时,我收到以下错误:

scala> print(johnsmith)                                                       

error: not enough arguments for method print: (name: String,surname: String)Unit.
Unspecified value parameter surname.
       print(johnsmith)
            ^
Run Code Online (Sandbox Code Playgroud)

这有什么办法吗?我可以通过让print接受Tuple2来实现这一点:

def print2(t:Tuple2[String,String]) { println(t._1 + " " + t._2) }
Run Code Online (Sandbox Code Playgroud)

现在我可以用任何一种方式调用它:

scala> print2(johnsmith)
John Smith

scala> print2("john", "smith")
john smith
Run Code Online (Sandbox Code Playgroud)

有什么我想念的吗?

Dan*_*ral 10

除了Dave的回答,这也有效:

(print _).tupled(johnsmith)
Run Code Online (Sandbox Code Playgroud)

通常,Function.tupled最适用于匿名函数和闭包map以及类似的方法.例如:

List("abc", "def", "ghi").zipWithIndex.map(Function.tupled(_ * _))
Run Code Online (Sandbox Code Playgroud)

在这种情况下,类型for _ * _已经定义Function.tupled.尝试使用tupled它而不是它,因为在tupled转换它之前定义了该函数.

对于您的特定情况,tupled工作,因为print已知类型.


Dav*_*ith 9

首先将方法转换为函数,然后将两个args的函数转换为一个元组的函数.

Function.tupled(print _)(johnsmith)
Run Code Online (Sandbox Code Playgroud)