2016-08-02 6 views
0

Diese beiden scheinen sehr ähnlich zu sein. In der Funktion, die ich unten in der REPL ausgeführt habe, scheinen sie für den Rückgabetyp austauschbar zu sein.Was ist der Unterschied zwischen einem Knoten und einem Elem in Scala?

scala> import scala.xml.{Elem, Node} 
import scala.xml.{Elem, Node} 

scala> def addChild(parent: Elem, child: Node): Node = { 
    |  parent.copy(child = parent.child ++ child) 
    | } 
addChild: (parent: scala.xml.Elem, child: scala.xml.Node)scala.xml.Node 

aber ich sehe, dass Elem hat eine .child Eigenschaft und Knoten nicht. Was ist der Unterschied zwischen Elem und Node?

+0

@ jwvh - es kompiliert einfach gut. editierter Beitrag zur besseren Übersichtlichkeit – doub1ejack

+1

Ich fand diesen Blogbeitrag auf Scala XML nützlich - http://www.codecommit.com/blog/scala/working-with-scalas-xml-support. –

Antwort

2

Die Node scala documentation sagt:

Eine abstrakte Klasse XML mit Knoten eines markierten Baum darstellt. Diese Klasse enthält eine Implementierung einer Teilmenge von XPath für die Navigation.

Die Elem scala documentation sagt:

Der Fall Klasse Elem die Node-Klasse erweitert, ein unveränderliches Datenobjekts darstellt Bereitstellen ein XML-Element.

Wenn die eingebettete XML-Syntax in scala mit Elem s hergestellt werden, weil es die einzige konkrete Umsetzung von Node, die scala kennt ist.

Sie können keine Instanz eines Node erstellen, ohne die abstrakten Methoden (child und label) zu implementieren. Elem führt dies für Sie aus und bietet eine einfache Möglichkeit, Node über eine Standard-API zu erstellen.

Elem fügt auch eine Handvoll Hilfsmethoden hinzu, die oft nützlich sind. In Methoden, die zwischen der Annahme eines Node oder Elem entscheiden müssen, hängt es davon ab, ob diese zusätzlichen Funktionen innerhalb der Methode benötigt werden oder nicht. Wenn Sie eine Node akzeptieren, sind Sie in einem flexibleren Status, um jede Implementierung dieser Klasse zu akzeptieren. Das Akzeptieren einer Elem könnte Ihnen einige zusätzliche Helfer zur Verfügung stellen, aber es beschränkt Sie darauf, nur Elem Implementierungen von Node zu akzeptieren. Viele von Elem 's Methoden geben Node (oder NodeSeq) zurück, so dass Sie im Allgemeinen die allgemeinere Node (oder NodeSeq) anstelle einer Elem akzeptieren möchten.

Jenseits gerade diese Diskussion, ist es im Allgemeinen gute Praxis als die am wenigsten spezifische Art möglich (Node) als Parameter und gibt die meisten spezifische Art möglich (Elem) zu akzeptieren:

def f(x: Node): Elem = ... 

Spezifische Anwendungsfälle sollten noch in Betracht gezogen werden.

1

Einfache Antwort: Es gibt verschiedene Arten von Knoten in einem XML-Baum: Elemente, Textknoten, Attributknoten, Kommentarknoten usw. Jedes Element ist also ein Knoten, aber nicht jeder Knoten ist ein Element.