Как я могу вызвать функцию, которая принимает 2 параметра с помощью Tuple2?

У меня есть такая функция:

def print(name:String, surname:String) { println(name + " " + surname) }

У меня также есть Tuple2:

val johnsmith = ("John", "Smith")

Когда я вызываю печать с помощью johnsmith, я получаю следующую ошибку:

scala> print(johnsmith)                                                       

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

Есть ли какой-то путь вокруг этого? Я могу заставить это работать, сделав печать принятой Tuple2:

def print2(t:Tuple2[String,String]) { println(t._1 + " " + t._2) }

Теперь я могу назвать это в любом случае:

scala> print2(johnsmith)
John Smith

scala> print2("john", "smith")
john smith

Есть ли что-то, что мне не хватает?

Ответ 1

Сначала преобразуем метод в функцию, а затем преобразуем функцию двух аргументов в функцию одного кортежа.

Function.tupled(print _)(johnsmith)

Ответ 2

В дополнение к ответу Dave это тоже работает:

(print _).tupled(johnsmith)

Обычно функция Function.tupled будет работать лучше всего для анонимных функций и закрытий в сочетании с map и аналогичными методами. Например:

List("abc", "def", "ghi").zipWithIndex.map(Function.tupled(_ * _))

В этом случае тип для _ * _ уже определен Function.tupled. Попробуйте вместо этого использовать tupled, и это не сработает, потому что функция определена до того, как tupled преобразует ее.

В вашем конкретном случае tupled работает, поскольку тип print уже известен.