2010-10-28 20 views
6

Bir Lift uygulamasını bazı mevcut Java kodlarına entegre etmeye çalışıyorum. Parçacıkların birinde, onu bir NodeSeq'e eşlemem gereken bir Java nesnesi var. Bir Düğüm Dizisi alabilirim, ancak bir NodeSeq değil. (En azından, çok fonksiyonel görünümlü bir şekilde değil).Array [Node] 'u NodeSeq'e nasıl dönüştürebilirim?

import scala.xml.NodeSeq 

// pretend this is code I can't do anything about 
val data = Array("one", "two", "three") 

// this is the function I need to write 
def foo: NodeSeq = data.map { s => <x>{s}</x> } 
//      ^
// error: type mismatch; 
// found : Array[scala.xml.Elem] 
// required: scala.xml.NodeSeq 

Bunu yapmanın en temiz yolu nedir?

+1

Her zaman '++' yönteminin kullanılabilir :-) yeni NodeSeq() ++ theArray_Elm_thing'. Daha iyi yollar olabilir. Mutlu kodlama. –

+1

NodeSeq soyut, bu nedenle 'yeni NodeSeq()' çalışmıyor. –

cevap

8

nesne Array içinde canBuildFrom yerine foldLeft

scala> def foo: NodeSeq = data.map { s => <x>{s}</x> } toSeq 
foo: scala.xml.NodeSeq 

veya kullanım (Seq[Node]NodeSeq bir süper sınıf olduğu göz önüne alındığında) map

scala> def foo: NodeSeq = (Seq[Node]() /: data) {(seq, node)=> seq ++ <x>{node}</x>} 
foo: scala.xml.NodeSeq 
+1

toSeq, aradığınız zarafetle ilgili bir soruya cevap vermek için uygun görünüyordu. Teşekkürler! – leedm777

+0

Harita ve daha sonra sekme kullanmak, 2 koleksiyon oluşturduğunuz anlamına gelir. BreakOut kullanarak yaratıyorsunuz 1. – IttayD

+2

'toSeq' bir sarıcı (http://www.scala-lang.org/api/current/scala/collection/mutable/WrappedArray.html) oluşturur, bu yüzden sefil bir performans cezası var. http://www.scala-lang.org/docu/files/collections-api/collections_38.html –

9
scala> import collection.breakOut 
import collection.breakOut 

scala> def foo: NodeSeq = data.map { s => <x>{s}</x> }(breakOut) 
foo: scala.xml.NodeSeq 

Yöntem haritasında aslında iki bağımsız değişken listesi vardır. İlk, geçtiğiniz bir işlevi kabul eder. İkincisi, geri dönen diziyi oluşturan bir oluşturucu oluşturmak için kullanılan bir CanBuildFrom nesnesini kabul eder. Bu argüman örtüktür, bu yüzden genellikle derleyici sizin için doldurur. 3 tip parametreyi kabul eder: From, T, To. Birkaç öntanımlı örtük var (NodeSeq nesnesinde dahil), ancak bunların hiçbiri From = Array, T = Node, To = NodeSeq ile eşleşmiyor.

breakOut bu sorunu çözer: bir CanBuildFrom örneğini dolaylı bir CanBuildFrom [Hiçbir şey, T, Kime] arayarak döndüren genel bir yöntemdir. Gizli arama kurallarına göre, herhangi bir CanBuildFrom, T, To ile eşleşir ve Kimden> Hiçbir şey kabul edilemez. Bu durumda: Ben sadece dizisine map çıkışını dönüştürmek istiyorum

+2

http://stackoverflow.com/questions/1715681/scala-2-8-breakout –

1

Bu yöntemi NodeSeq tamamlayıcı nesnesinde arıyorsunuz.

NodeSeq.fromSeq(s: Seq[Node]) 
İlgili konular