كيف يمكنني تحويل المصفوفة [العقدة] إلى nodeseq؟

StackOverflow https://stackoverflow.com/questions/4047111

  •  27-09-2019
  •  | 
  •  

سؤال

أحاول دمج تطبيق الرفع في بعض كود 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])
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top