Для опций, которые не работали:
scala> myTuples.map{ println _._1 }
Краткий ответ: В Scala вам всегда нужно использовать парены вокруг аргумента println
. Длинный ответ: Scala выводит скобки только для инфиксных методов, что означает, что код форм object method argument
интерпретируется как object.method(argument)
.Объект не указан, поэтому круглые скобки не выводятся.Вы можете увидеть это непосредственно:
scala> println "Boom!"
<console>:1: error: ';' expected but string literal found.
println "Boom!"
^
Далее, myTuples.map{ println(_._1) }
. Мне не сразу понятно, почему это не работает, поскольку это должно быть эквивалентно myTuples.map{ x => println(x._1) }
, который работает. Как и ответы на этот вопрос показать, заполнитель / частично примененСинтаксис метода применяется к наименьшей возможной области видимости.Таким образом, эквивалентный код будет myTuples.map { println(x => x._1) }
.Поскольку для scala недостаточно информации, чтобы вывести тип x
, вы получаете ошибку «отсутствует тип параметра».
Относительно myTuples.map{ val (id, name) = _ }
, заполнители используются в анонимных функциях, тогда как здесь вы инициализируете val
s.
Тогда для myTuples.map{ x => println x }
вам также не хватает паренов.
Наконец, вариант, который работал для вас myTuples.map{ x => println("id: %s, name: %s".format(id, name)) }
, фактически не работал(посмотрите на распечатанные данные).Полагаю, если вы уже определили id
и name
в REPL, и эти значения выводятся на печать. Ваши рабочие решения теперь работают нормально.
Мое решение для того, что вы делаетепопытка сделать будет:
myTuples foreach {
case (id, name) => printf("id: %s, name: %s\n", id, name)
}
или
myTuples foreach {
x => printf("id: %s, name: %s\n", x._1, x._2)
}