Как преобразовать неизменяемый Seq в изменяемый seq с помощью цикла - PullRequest
10 голосов
/ 08 мая 2011

Я пытаюсь вернуть изменяемую последовательность с циклом before, но у меня есть неизменяемый 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}) 

Как я могу заставить цикл до возвращать изменяемый seq?Спасибо сообществу scala!

Ответы [ 2 ]

12 голосов
/ 08 мая 2011

Вы можете преобразовать неизменяемую последовательность в изменяемую, создав новую изменяемую последовательность с помощью конструктора 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)
3 голосов
/ 08 мая 2011

Если компилятор знает, какой тип коллекции ожидать (и он делает это здесь, как указано в сообщении об ошибке), вы можете использовать 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())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...