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

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

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

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

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

Когда я вызываю print с 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

Что-то мне не хватает?

10
задан ssanj 18 August 2010 в 02:08
поделиться

2 ответа

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

Function.tupled(print _)(johnsmith)
9
ответ дан 3 December 2019 в 20:02
поделиться

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

(print _).tupled(johnsmith)

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

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

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

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

10
ответ дан 3 December 2019 в 20:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: