2016-08-02 10 views
0

この2つは非常によく似ています。私が以下のREPLで実行した関数では、戻り型に対して互換性があるようです。ScalaのNodeとElemの違いは何ですか?

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 

しかし、私はElem.child性を有し、ノードがないことがわかります。一般的にElemとNodeの違いは何ですか?

+0

@jwvh - うまくコンパイルされます。明確にするために編集済みのポスト。 – doub1ejack

+1

Scala XMLのこのブログ記事が役立つことがわかりました - http://www.codecommit.com/blog/scala/working-with-scalas-xml-support –

答えて

2

Node scala documentationは言う:

ラベルされたツリーのノードを持つXMLを表現する抽象クラスを。このクラスには、ナビゲーション用のXPathのサブセットの実装が含まれています。

Elem scala documentationは言う:

ケースクラスElemのは、XMLの要素を表す不変データオブジェクトを提供し、ノードクラスを拡張します。

Scalaで埋め込まれたXML構文を使用している場合、それはScalaは知っているNodeの唯一の具体的な実装だからElem sが生成されます。

抽象メソッド(childおよびlabel)を実装せずにNodeのインスタンスを作成することはできません。 Elemはこれを実現し、標準APIを使用してNodeを簡単に作成する方法を提供します。

Elemには、しばしば便利なヘルパーメソッドがいくつか追加されています。 NodeまたはElemを受け入れるかどうかを決定する必要のあるメソッドでは、これらの余分な機能がメソッド内に必要かどうかによって異なります。 Nodeを受け入れると、そのクラスの実装を受け入れるより柔軟な状態になります。 Elemを受け入れると、余分なヘルパーが追加される可能性がありますが、Elem個の実装だけを受け入れるように制限するのは、Nodeです。 Elemのメソッドの多くはNode(またはNodeSeq)を返すので、一般的にElemではなく、より一般的なNode(またはNodeSeq)を受け入れることをお勧めします。

超えてちょうどこの議論、一般的にパラメータとして可能な少なくとも特定のタイプ(Node)を受け入れ、可能な限り最も具体的なタイプ(Elem)を返すように良い習慣を考えられています:

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

具体的なユースケースなければならないまだ考慮されます。

1

単純な答え:要素、テキストノード、属性ノード、コメントノードなど、XMLツリーにはいくつかの種類のノードがあります。したがって、すべての要素はノードですが、すべてのノードが要素ではありません。

関連する問題