我尝试使用两个版本的代码来了解scala中的yield如何工作。我无法理解为什么我得到两个不同的结果
在这个版本中,我调用yield,表达式只是乘以2.我得到了前10的倍数为2的向量。这对我来说很有意义
scala> val r = for (j <- 1 to 10) yield {
| (j*2).toString //multiply by 2
| }
r: scala.collection.immutable.IndexedSeq[String] = Vector(2, 4, 6, 8, 10, 12, 14, 16, 18, 20) // got multiples of 2. This looks ok
有趣的是在这个版本中,我所做的就是将val中的乘法乘以2。但现在我得到一个空的矢量!这是为什么?
scala> val r = for (j <- 1 to 10) yield {
| val prod = (j*2).toString //multiply by 2 but store in a val
| }
r: scala.collection.immutable.IndexedSeq[Unit] = Vector((), (), (), (), (), (), (), (), (), ()) //this is empty
我认为val prod =(j * 2).toString可能导致单元结果但是当我尝试在scala解释器上执行独立表达式时,我可以看到prod是一个String
scala> val prod = 2.toString()
prod: String = 2
答案 0 :(得分:0)
在Scala中,每个表达式都会返回一些内容。但由于性能原因,分配旨在返回Unit
(请参阅What is the motivation for Scala assignment evaluating to Unit rather than the value assigned?)。
在您的代码段中,在最后一个示例中,REPL说prod: String = 2
,意味着prod
有一些价值,这是为了您的方便。但请尝试{ val prod = 2.toString() }
:
scala> { val prod = 2.toString() }
scala> println(res0)
()
()
是Unit
类型的唯一可能值。
(我不确定为什么res0
在第一次之后没有显示,因为resN
- 类似于REPL中的值会收集所有未分配的显式结果)