Vil*_*tas 1 arrays scala range
假设我有一个这样的函数(它只是一个例子,所以不要给我更好的方法来创建0,1,2,...样式数组):
def createArray(size: Int): Array[Int] = {
for (i <- 0 until size) yield i
}
Run Code Online (Sandbox Code Playgroud)
但编译器因一些神秘的类型不匹配错误而感到不安:
(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>
Run Code Online (Sandbox Code Playgroud)
我敢肯定,原因与until方法的返回类型Range不是这样的事实有关Array.然而,为什么编译器不能只是转换类型?有趣的是,当我删除函数的返回类型时,问题就消失了:
def createArray(size: Int) = {
for (i <- 0 until size) yield i
}
Run Code Online (Sandbox Code Playgroud)
但我希望我的功能能够回归Array......
我还有另一个功能,如下所示:
def screateArray2: Array[Int] = {
val a = Array(1,2,3,4,5)
for (i <- a) yield i
}
Run Code Online (Sandbox Code Playgroud)
它编译没有任何问题.它产生的值与第一个示例非常相似,但直到方法才使用...
我是否遗漏了Scala的类型系统?
我对Scala很新.
编辑:我有点像这样解决了我的问题:
def crop(data: Array[Int]): Array[Int] = (
for (i <- 0 until data.size) yield i
).toArray
Run Code Online (Sandbox Code Playgroud)
但在我看来,它是可读的......
您不能仅仅因为Array不是Range,也不是它的超类来转换类型.我认为他们最常见的超类型是IndexedSeq.因此,您的示例类似于您声明返回Int的方法,而实现将返回String,例如.toArray但是,Range确实有一个方法,所以如果你想使用until样式并返回一个数组,你可以这样做:
scala> (for (i <- 0 until 5) yield i).toArray
res0: Array[Int] = Array(0, 1, 2, 3, 4)
Run Code Online (Sandbox Code Playgroud)
或者,如果不喜欢这样,还有另一种方式,但不使用直到样式:
scala> for (i <- Array.range(0,5)) yield i
res1: Array[Int] = Array(0, 1, 2, 3, 4)
Run Code Online (Sandbox Code Playgroud)
另外,请检查此相关问题,以便从理解中返回自定义类型
| 归档时间: |
|
| 查看次数: |
1244 次 |
| 最近记录: |