【发布时间】:2010-07-25 08:21:29
【问题描述】:
假设我有一个这样的函数(这只是一个例子,所以不要为我提供更好的方法来创建 0,1,2,... 样式数组):
def createArray(size: Int): Array[Int] = {
for (i <- 0 until size) yield i
}
但是编译器对一些神秘的类型不匹配错误感到不安:
(fragment of compare-images.scala):39: error: type mismatch;
found : RandomAccessSeq.Projection[Int]
required: Array[Int]
for (i <- 0 until size) yield i
^
one error found
!!!
discarding <script preamble>
我敢肯定,原因与until 方法的返回类型是Range,而不是Array 这一事实有关。然而,为什么编译器不能只转换类型?
有趣的是,当我删除函数的返回类型时,问题就消失了:
def createArray(size: Int) = {
for (i <- 0 until size) yield i
}
但我希望我的函数返回 Array...
我还有另一个函数,是这样的:
def screateArray2: Array[Int] = {
val a = Array(1,2,3,4,5)
for (i <- a) yield i
}
它编译没有任何问题。它产生的值与第一个示例非常相似,但不使用 until 方法...
我是否遗漏了有关 Scala 类型系统的某些内容?
我对 Scala 还是很陌生。
编辑:我有点像这样解决了我的问题:
def crop(data: Array[Int]): Array[Int] = (
for (i <- 0 until data.size) yield i
).toArray
但在我看来,它一点也不可读……
【问题讨论】: