我正在尝试将 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/