gpt4 book ai didi

scala 新手遇到元组和闭包问题

转载 作者:行者123 更新时间:2023-12-04 22:34:42 25 4
gpt4 key购买 nike

我有一个元组列表,我想遍历并获取每个元素的值。

这是代码:

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 的第一步中,发生在我身上的事情是坚持一点点你得到你想要的,但你不确定为什么你尝试的第一个选项不起作用......

最佳答案

对于不起作用的选项:

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) } ,这有效。如 the answers to this question显示,占位符/部分应用的方法语法适用于尽可能小的范围。所以等效代码是 myTuples.map { println(x => x._1) } .由于 scala 没有足够的信息来推断 x 的类型,您会收到“缺少参数类型”错误。

关于 myTuples.map{ val (id, name) = _ } , 占位符用于匿名函数,而这里您正在初始化 val的。

然后为 myTuples.map{ x => println x } ,你也缺少括号。

最后,适合您的选项 myTuples.map{ x => println("id: %s, name: %s".format(id, name)) } ,实际上并没有工作(看看它打印出来的数据)。我猜你是否已经定义了 idname在 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)
}

关于scala 新手遇到元组和闭包问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9981399/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com