Если вы посмотрите на исходный код для \\
в NodeSeq.scala вы можете увидеть, что это на самом деле просто немного сахара для filter
операции над descendant_or_self
, которая является List[Node]
, с помощью узла label
.
Таким образом, вы могли бы сделать то же самое самостоятельно, соответствуя против установить меток, например:
val searchedLabels = Set("p", "div")
val results = body.descendant_or_self.filter(node => searchedLabels.contains(node.label))
Или, если вы действительно хотите, чтобы выглядеть как «встроенный» функциональность , вы можете сутенер-на подходящий метод scala.xml.Node
следующим образом:
class ExtendedNode(n: Node) {
def \\\(labels: Set[String]): NodeSeq = {
n.descendant_or_self.filter(node => labels.contains(node.label))
}
}
implicit def node2extendedNode(n: Node): ExtendedNode = new ExtendedNode(n)
val results = body \\\ Set("p", "div")
хотя я должен сказать, что я не уверен, что мне нравится либо имя-метода или применение подразумевается здесь :-(
Пожалуйста, объясните, почему вам не нравится использование неявного здесь? – Chosmos
Просто личное предпочтение. Я обнаружил, что (вообще) неявки не понятны и/или могут быть трудноразрешимы при просмотре новой кодовой базы. Этот особый стиль, то есть «объект сутенерства», делая сайт приложения очень опрятным, просто немного неясен/магии для моего вкуса. Если это мой код, я бы просто * явно * обернул 'body' в' new ExtendedNode'. – millhouse
Получил ваш момент, и, кроме некоторого особого случая, я согласен, что вы это заметили. спасибо – Chosmos