scala - 如何将 Array[Node] 转换为 NodeSeq?

标签 scala scala-2.8 lift

我正在尝试将 Lift 应用程序集成到一些现有的 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

什么是最干净的方法来做到这一点?

最佳答案

scala> import collection.breakOut
import collection.breakOut

scala> def foo: NodeSeq = data.map { s => <x>{s}</x> }(breakOut)
foo: scala.xml.NodeSeq

方法映射实际上有两个参数列表。第一个接受您传递的函数。第二个接受一个 CanBuildFrom 对象,该对象用于创建一个构建器,然后构建返回序列。这个参数是隐式的,所以通常编译器会为你填充它。它接受 3 个类型参数:From、T、To。有几个 predef 隐式(包括在对象 NodeSeq 中),但它们都不匹配 From=Array、T=Node、To=NodeSeq。

breakOut 解决了这个问题:它是一个通用方法,它通过搜索隐式 CanBuildFrom[Nothing, T, To] 来返回一个 CanBuildFrom 实例。根据隐式搜索规则,任何匹配 T、To 且具有 From > Nothing 的 CanBuildFrom 都是可接受的。在这种情况下:对象数组中的 canBuildFrom

关于scala - 如何将 Array[Node] 转换为 NodeSeq?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4047111/

相关文章:

scala - 如何使用kafka流为kafka主题中的 key 保留N个最新值

scala - 使用 Scala 的数字和小数进行更高级的数学运算

scala - 将 Scala 可变参数转换为 Java 对象...可变参数

Scala 将隐式转换优先于 "natural"操作......为什么?这是一个错误吗?还是我做错了什么?

scala - 如何创建独立的电梯网络应用程序?

scala - Kubernetes上如何读取spark-submit上传的文件

scala - scala 函数参数的情况是否相关?

ruby-on-rails - Scala + Lift 或 Ruby on Rails,适合初学者

Scala Liftweb - 模式类型与预期类型不兼容

java - 在scala中使用泛型创建java匿名类的问题