2013-01-21 27 views
18

Bunu, belki de Blister veya yöntemlerle verimli bir şekilde gerçekleştirmenin bir yolu var mı? aşağıdaki gibi benim asıl sorun ben, bir ayrıştırıcı bir liste kapalı inşa ediyorum edilir:List ListBuffer'a nasıl dönüştürülür?

lazy val nodes: Parser[List[Node]] = phrase((nodeA | nodeB | nodeC).*) 

Ama oluşturduktan sonra, bunu yerine bir tampon olmak istiyorum - Ben sadece bir tampon düz nasıl oluşturulacağını emin değilim ayrıştırıcıdan.

+0

"toBuffer" ın yeterince verimli olmaması endişeniz mi var? – cheeken

+0

Eğer doğru bir şekilde anlarsam, bir 'ListBuffer' ister, 'toBuffer' tarafından döndürülen herhangi bir 'Buffer'ı değil –

+0

Evet, bir ListBuffer'a ihtiyacım var. Performans sadece bir kaygıdır çünkü dönüşümün maliyetinin ne olduğunu bilmek istiyorum (doğrusal olduğunu varsayalım), fakat bu sadece bir başlatma aşamasının bir parçası olduğu için kabul edilebilir. – Dan

cevap

37

to gerçekten hüner yok, ve kullanımı oldukça önemsiz: scala 2.9.x için scala 2.10.x

yılında

scala> val l = List(1,2,3) 
l: List[Int] = List(1, 2, 3) 
scala> l.to[ListBuffer] 
res1: scala.collection.mutable.ListBuffer[Int] = ListBuffer(1, 2, 3) 

İşleri, yapabileceğiniz:

scala> ListBuffer.empty ++= l 
res1: scala.collection.mutable.ListBuffer[Int] = ListBuffer(1, 2, 3) 
+0

Nice; 1! Sadece koleksiyonlar API düşünüldüğünde (2.8 perspektifinden) daha büyülü olamazdı ... – cheeken

+0

'++ =' boş bir yaratma yerine tekrar aynı 'ListBuffer'ı tekrar kullanacak ve sonra tekrar atacak . (Boş bir 'ListBuffer' yaratmanın özellikle pahalı olmadığı değil.) –

+0

İyi nokta, cevabı güncelleyeceğim. –

İlgili konular