2016-08-02 2 views
0

Эти два кажется очень похожими. В функции, которую я запускал в REPL ниже, они кажутся взаимозаменяемыми для возвращаемого типа.В чем разница между узлом и Elem в 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 

Однако я вижу, что Elem имеет .child свойство и узел не делает. Вообще, в чем разница между Elem vs 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 говорит:

Корпуса класс Эль расширяет класс Node, обеспечивая неизменный объект данных, представляющий собой элемент XML.

При использовании встроенного синтаксиса XML в Скале Elem s производится, потому что это только конкретная реализация Node, что знает о Scala.

Невозможно создать экземпляр Node без абстрактных методов (child и label). Elem выполняет это для вас и обеспечивает простой способ создания Node через стандартный API.

Elem также добавляет несколько вспомогательных методов, которые часто полезны. В методах, которые необходимо решить между принятием Node или Elem, зависит от того, нужны ли эти дополнительные функции внутри метода. Принятие Node оставляет вас в более гибком состоянии, чтобы принять любую реализацию этого класса. Принятие Elem может предоставить вам дополнительные помощники, но это ограничивает принятие только Elem реализаций Node. Многие из методов Elem возвращают Node (или NodeSeq), поэтому в целом вы хотите принять более общие Node (или NodeSeq), а не Elem.

Помимо всего этого обсуждения, это обычно считается хорошей практикой принимать наименее конкретный тип возможного (Node) в качестве параметра и возвращает наиболее конкретный тип возможного (Elem):

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

Конкретные случаи использования, должны по-прежнему быть на рассмотрении.

1

Простой ответ: в дереве XML есть несколько видов узлов: элементы, текстовые узлы, узлы атрибутов, узлы комментариев и т. Д. Таким образом, каждый элемент является узлом, но не каждый узел является элементом.

Смежные вопросы