كيف يمكنني تحويل المصفوفة [العقدة] إلى nodeseq؟
سؤال
أحاول دمج تطبيق الرفع في بعض كود Java الحالي. في إحدى قصاصي ، لدي مجموعة من كائنات Java التي أحتاج إلى تعيينها في Nodeseq. يمكنني الحصول على مجموعة من العقدة ، ولكن ليس nodeseq. (على الأقل ، ليس بطريقة وظيفية للغاية).
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
ما هي أنظف طريقة للقيام بذلك؟
المحلول
سأتحول ببساطة map
الإخراج إلى التسلسل (بالنظر إلى ذلك Seq[Node]
هو فئة فائقة من NodeSeq
)
scala> def foo: NodeSeq = data.map { s => <x>{s}</x> } toSeq
foo: scala.xml.NodeSeq
او استعمل foldLeft
بدلاً من map
scala> def foo: NodeSeq = (Seq[Node]() /: data) {(seq, node)=> seq ++ <x>{node}</x>}
foo: scala.xml.NodeSeq
نصائح أخرى
scala> import collection.breakOut
import collection.breakOut
scala> def foo: NodeSeq = data.map { s => <x>{s}</x> }(breakOut)
foo: scala.xml.NodeSeq
خريطة الطريقة لديها في الواقع قائمتين وسيطة. الأول يقبل وظيفة ، مررت بها. والثاني يقبل كائن CanBuildFrom الذي يتم استخدامه لإنشاء منشئ يقوم بعد ذلك بإنشاء تسلسل العودة. هذه الحجة ضمنية ، لذلك عادة ما يملأها المترجم لك. يقبل 3 معلمات النوع: من ، t ، إلى. هناك العديد من ضمني مسبق (بما في ذلك في الكائن nodeseq) ، ولكن لا يتطابق أي منها من = صفيف ، t = العقدة ، إلى = nodeseq.
يحل Breakout هذا: إنها طريقة عامة تُرجع مثيل CanBuildFrom من خلال البحث عن canbuildfrom الضمني [لا شيء ، t ، إلى]. وفقًا لقواعد البحث الضمنية ، فإن أي canbuildfrom يتطابق مع T ، إلى و From> لا يوجد شيء مقبول. في هذه الحالة: canbuildfrom في مجموعة الأشياء
أنت تبحث عن هذه الطريقة على كائن Nodeseq Companion.
NodeSeq.fromSeq(s: Seq[Node])