у новичка Скала проблемы с кортежами и замыканиями - PullRequest
4 голосов
/ 02 апреля 2012

У меня есть список кортежей, и я бы хотел пройти и получить значение каждого элемента.

это код:

scala> val myTuples = Seq((1, "name1"), (2, "name2"))
myTuples: Seq[(Int, java.lang.String)] = List((1,name1), (2,name2))

scala> myTuples.map{ println _ }
(1,name1)
(2,name2)
res32: Seq[Unit] = List((), ())

Пока все хорошо, но

scala> myTuples.map{ println _._1 }
<console>:1: error: ';' expected but '.' found.
    myTuples.map{ println _._1 }

Я также пытался с:

scala> myTuples.map{ println(_._1) }
<console>:35: error: missing parameter type for expanded function ((x$1) => x$1._1)
          myTuples.map{ println(_._1) }

scala> myTuples.map{ val (id, name) = _ }
<console>:1: error: unbound placeholder parameter
       myTuples.map{ val (id, name) = _ }

scala> myTuples.map{ x => println x }
<console>:35: error: type mismatch;
 found   : Unit
 required: ?{val x: ?}
Note that implicit conversions are not applicable because they are ambiguous:
 both method any2Ensuring in object Predef of type [A](x: A)Ensuring[A]
 and method any2ArrowAssoc in object Predef of type [A](x: A)ArrowAssoc[A]
 are possible conversion functions from Unit to ?{val x: ?}
              myTuples.map{ x => println x }

Объявление переменной и использование скобок, но я хотел бы знать, почему другие параметры не сделалиработа

все работало нормально

myTuples.map{ x => println("id: %s, name: %s".format(x._1, x._2)) }

scala> myTuples.map{ x => println("id: %s, name: %s".format(x._1, x._2)) }
id: 1, name: name1
id: 2, name: name2
res21: Seq[Unit] = List((), ())

scala> myTuples.map{ x => val(id, name) = x; println("id: %s, name: %s".format(id, name)) }
id: 1, name: name1
id: 2, name: name2
res22: Seq[Unit] = List((), ())

scala> myTuples.map{ x => println(x._1) }

Что случается со мной, с моими первыми шагами по scala, так это то, что вы настаиваете немного, что вы получаете то, что хотите, но вы не уверены, почему первыйварианты, которые вы пробовали, не работали ...

Ответы [ 2 ]

6 голосов
/ 02 апреля 2012

Для опций, которые не работали:

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)
}
5 голосов
/ 02 апреля 2012

Я думаю, вы хотите что-то вроде:

myTuples map { case(id, name) => println(id+": "+name) }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...