【发布时间】:2013-12-29 03:33:18
【问题描述】:
yield 主要用于 for-yield 循环以生成新的同类型集合。例如:
scala> val a = Array(2,3,5)
a: Array[Int] = Array(2, 3, 5)
scala> val result = for (elem <- a) yield 2 * elem
result: Array[Int] = Array(4, 6, 10)
这一切都很好,for循环接受一个数组并返回一个数组。
但后来我注意到了:
scala> 1 to 10
res0: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
这会生成一个范围类型的集合,但是当你将它与 for-yield 循环结合使用时,会发生这种情况:
scala> for (i <- (1 to 10)) yield i + 2
res2: scala.collection.immutable.IndexedSeq[Int] = Vector(3, 4, 5, 6, 7, 8, 9, 10, 11, 12)
进来的类型是范围,但它发出的类型是Vector。为什么会这样?我错过了什么吗?
【问题讨论】:
-
这是错误的:“
yield主要用于 for-yield 循环以生成新的同类型集合。” -
嗯..这是我在
yield..@Jean-PhilippePellet 看到的唯一情况,我认为yield的含义及其用法应该更多 -
@WindDweller 更多。您使用 for-comprehensions 进行单子流控制和组合。看看你是如何使用
Future来理解的,它会让你大吃一惊。还可以查看Try处理异常的能力。 -
@WindDweller:第二个问题应该移到一个单独的问题中。虽然你会得到类似的答案,但不会那么混乱。
标签: scala