我有一个元组列表,我想遍历并获取每个元素的值。
这是代码:
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的第一步中发生的事情是,坚持一点点你得到你想要的东西,但你不确定为什么你尝试的第一个选项没有工作......
答案 0 :(得分:6)
对于不起作用的选项:
scala> myTuples.map{ println _._1 }
简答:在Scala中,你总是需要在println
的论点周围使用parens。 长答案: Scala仅推断中缀方法的括号,意味着表单object method argument
的代码被解释为object.method(argument)
。没有指定对象,因此不推断出括号。你可以直接看到这个:
scala> println "Boom!"
<console>:1: error: ';' expected but string literal found.
println "Boom!"
^
接下来,myTuples.map{ println(_._1) }
。 我不能立即明白为什么这不起作用,因为这应该等同于如the answers to this question所示,占位符/部分应用的方法语法适用尽可能小的范围。因此,等效代码为myTuples.map{ x => println(x._1) }
,这有效。myTuples.map { println(x => x._1) }
。由于scala没有足够的信息来推断x
的类型,因此会出现“缺少参数类型”错误。
关于myTuples.map{ val (id, name) = _ }
,占位符用于匿名函数,而在这里您正在初始化val
。
然后对于myTuples.map{ x => println x }
,你也错过了parens。
最后,适用于您你的工作解决方案现在正常工作。myTuples.map{ x => println("id: %s, name: %s".format(id, name)) }
的选项实际上并不起作用(查看它打印出来的数据)。我猜你是否已经在REPL中定义了id
和name
,那些是正在打印的值。
我做你想做的事情的解决方案是:
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)
}
答案 1 :(得分:5)
我想你想要这样的东西:
myTuples map { case(id, name) => println(id+": "+name) }