我正在尝试使用until循环返回一个可变序列,但是我有一个不可变的seq返回(0到nbGenomes):
def generateRandomGenome(nbGenomes:Int): IndexedSeq[GenomeDouble]={
return ((0 until nbGenomes toSeq).map{e => generateRandomGenome})
}
返回编译错误:
found : scala.collection.immutable.IndexedSeq[org.openmole.tools.mgo.mappedgenome.genomedouble.GenomeDouble]
required: scala.collection.mutable.IndexedSeq[org.openmole.tools.mgo.mappedgenome.genomedouble.GenomeDouble]
return ((0 until nbGenomes toSeq).map{e => generateRandomGenome})
我如何强制until循环返回一个可变的seq? 谢谢scala社区!
答案 0 :(得分:11)
您可以通过使用varargs构造函数创建新的可变序列,将不可变序列转换为可变序列。
scala> val l = List(1,2,3)
l: List[Int] = List(1, 2, 3)
scala> scala.collection.mutable.ArraySeq(l:_*)
res0: scala.collection.mutable.ArraySeq[Int] = ArraySeq(1, 2, 3)
答案 1 :(得分:3)
如果编译器知道期望哪种集合类型(并且它在此处如错误消息所示),则可以使用scala.collection.breakOut
来根据表达式的预期类型推断类型,而不是集合本身的类型。
def generateRandomGenomes(n: Int): collection.mutable.IndexedSeq[Double] =
(0 until n).map(_ => util.Random.nextDouble())(collection.breakOut)
(我稍微调整了你的例子以坚持众所周知的类型。)
大多数(所有?)集合类型在其伴随对象上都有一些方便的工厂方法。因此,实现同样事情的另一种方法是使用scala.collection.mutable.IndexedSeq.fill
:
def generateRandomGenomes(n: Int): collection.mutable.IndexedSeq[Double] =
collection.mutable.IndexedSeq.fill(n)(util.Random.nextDouble())