可能是一个菜鸟问题,但我想在一个简短的脚本中做这样的事情:
val s = if ( <some condition> ) Array(...) else List(...)
print(s.length)
问题是 s 将被推断为 Object
,因为 Array
和 List
没有共同的父类(super class)。因此第二行给出了一个错误,因为 Object
没有 length
方法。
提前致谢!
更新
呸,很遗憾我不能接受多个答案!谢谢你们的帮助,伙计们!我玩 Scala 有一段时间了,但似乎我还有很多东西要学:-)
最佳答案
您可以对Array
使用包装器并将s
用作Seq[T]
:
scala> val s = if (true) Array(1): Seq[Int] else List(1)
s: Seq[Int] = WrappedArray(1)
对于多维数组,您可以像这样创建自己的转换器:
implicit class ArrArrWrap[T](a: Array[Array[T]]) extends IndexedSeq[WrappedArray[T]] {
def length = a.length
def apply(idx: Int) = a(idx): WrappedArray[T]
}
用法:
scala> val s = if (true) Array(Array(1)): Seq[Seq[Int]] else List(List(1))
s: Seq[Seq[Int]] = (WrappedArray(1))
使用多维数组作为多维序列的想法有一个很大的缺点:
它涉及到除最后一个维度之外的每个维度的访问转换。
s(0) // <- conversion here
因此它可能会导致性能问题。将 Array
转换为 Seq
可能会更好:
scala> val s = if (true) Array(Array(1)).map{ i => i: Seq[Int] }(breakOut) else List(List(1))
s: scala.collection.immutable.Seq[Seq[Int]] = Vector(WrappedArray(1))
关于scala - 如何定义可以是 Array 或 List 的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17177787/