Ответ 1
Сначала преобразуем метод в функцию, а затем преобразуем функцию двух аргументов в функцию одного кортежа.
Function.tupled(print _)(johnsmith)
У меня есть такая функция:
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
Есть ли что-то, что мне не хватает?
Сначала преобразуем метод в функцию, а затем преобразуем функцию двух аргументов в функцию одного кортежа.
Function.tupled(print _)(johnsmith)
В дополнение к ответу Dave это тоже работает:
(print _).tupled(johnsmith)
Обычно функция Function.tupled будет работать лучше всего для анонимных функций и закрытий в сочетании с map
и аналогичными методами. Например:
List("abc", "def", "ghi").zipWithIndex.map(Function.tupled(_ * _))
В этом случае тип для _ * _
уже определен Function.tupled
. Попробуйте вместо этого использовать tupled
, и это не сработает, потому что функция определена до того, как tupled
преобразует ее.
В вашем конкретном случае tupled
работает, поскольку тип print
уже известен.