Как я могу вызвать функцию, которая принимает 2 параметра с Tuple2? - PullRequest
10 голосов
/ 18 августа 2010

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

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

Есть что-то, что я пропускаю?

Ответы [ 2 ]

10 голосов
/ 18 августа 2010

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

(print _).tupled(johnsmith)

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

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

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

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

9 голосов
/ 18 августа 2010

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

Function.tupled(print _)(johnsmith)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...