如何使用until循环将不可变的Seq转换为可变的seq

时间:2011-05-08 13:55:31

标签: scala sequence immutability mutable

我正在尝试使用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社区!

2 个答案:

答案 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())