scala – Enrich-My-Library适用于所有Traversables
发布时间:2020-12-16 18:50:51 所属栏目:安全 来源:网络整理
导读:我试图弄清楚如何编写一个适用于任何Traversable [_]的函数交换函数,给定一个集合和交换索引.我想出了以下内容: def swap[A,CC % Traversable[A]](xs: CC,i: Int,j: Int): Traversable[A] = { xs.slice(0,i) ++ xs.slice(j,j+1) ++ xs.slice(i+1,j) ++ xs.s
|
我试图弄清楚如何编写一个适用于任何Traversable [_]的函数交换函数,给定一个集合和交换索引.我想出了以下内容:
def swap[A,CC <% Traversable[A]](xs: CC,i: Int,j: Int): Traversable[A] = {
xs.slice(0,i) ++
xs.slice(j,j+1) ++
xs.slice(i+1,j) ++
xs.slice(i,i+1) ++
xs.slice(j+1,xs.size)
}
swap(List(1,2,3,4,5),4) // => List(5,1)
我想知道如何将它变成Traversable的隐式扩展,使我能够用List(1,5).swap(0,4)调用它.我能得到的最接近的是: import language.implicitConversions
class RichTraversable[A,B <% Traversable[A]](xs: B) {
def swap(i: Int,j: Int): Traversable[A] = {
xs.slice(0,i) ++
xs.slice(j,j+1) ++
xs.slice(i+1,j) ++
xs.slice(i,i+1) ++
xs.slice(j+1,xs.size)
}
}
implicit def richTraversable[A,B <% Traversable[A]](ys: B)(implicit b: Traversable[A])
= new RichTraversable[A,B](ys)
不幸的是,这不是它.调用列表(1,4)会导致以下错误:
我觉得我必须遗漏一些东西,或者过度复杂化这个问题.有谁知道这应该如何构建? 注意:这纯粹是学术性的,不以任何方式在生产环境中使用.我正在努力更好地处理Scala的类型系统和界限. 解决方法
如果您使用的是Scala 2.10:
import scala.collection.generic.CanBuildFrom
import scala.collection.TraversableLike
implicit class TraversableWithSwap[A,Repr <: Traversable[A]](val xs: TraversableLike[A,Repr]) extends AnyVal {
def swap[That](i: Int,j: Int)(implicit bf: CanBuildFrom[Repr,A,That]): That = {
val builder = bf(xs.asInstanceOf[Repr])
builder.sizeHint(xs)
builder ++= xs.take(i)
builder ++= xs.slice(j,j + 1)
builder ++= xs.slice(i + 1,j)
builder ++= xs.slice(i,i + 1)
builder ++= xs.drop(j + 1)
builder.result
}
}
(AnyVal将其转换为值类,这意味着编译器会将其重写为静态函数,以避免在运行时实际执行包装.) 如果使用早期版本,请删除扩展AnyVal并使用隐式转换函数而不是隐式类: implicit def toTraversableWithSwap[A,Repr <: Traversable[A]](xs: TraversableLike[A,Repr]) = new TraversableWithSwap(xs) 并使用它: scala> Vector(1,5,6,7,8,9).swap(2,5) res0: scala.collection.immutable.Vector[Int] = Vector(1,9) 请注意,为所有Traversable定义此函数实际上没有意义,因为某些可遍历(如Set,Map等)是无序的,因此交换两个元素是没有意义的.您可能实际上想要为所有Seq或其他东西定义它. 另外:我们也可以同意将其称为“增强我的库”吗? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
