【发布时间】:2019-08-08 07:18:24
【问题描述】:
我有以下扩展类,它向任何 SeqLike 添加了一个 myAppend 方法。
implicit class WithAppend[A, R](s: SeqLike[A, R]) extends AnyVal {
def myAppend(i: A)(implicit cbf: CanBuildFrom[R, A, R]): R = s :+ i
}
如何将此代码移植到 Scala 2.13 并保留类似的性能特征?如果扩展类可以保持为AnyVal,则奖励积分
我尝试过的几件事:
class Extends1[R, S <: IsSeq[R]](c: R, isSeq: S) {
def myAppend(a: isSeq.A): R = (isSeq(c) :+ a).asInstanceOf[R]
}
但是asInstanceOf 令人失望 - 它甚至安全吗?
我能做到:
class Extends3[S[_], A](c: SeqOps[A, S, S[A]]) {
def myAppend(a: A): S[A] = c :+ a
}
但现在我们受限于 S[A] 形式的集合,而 Scala 2.12 代码可以采用任何 R。
【问题讨论】:
-
myAppend与:+的唯一区别似乎是它仅在返回类型与原始序列相同时可用。所以asInstanceOf并不像打破唯一的用例那么令人失望...... -
其他人可能无法回答这个问题,因为你还没有说出你想要完成的事情。很可能
[A, S[_]](val s: SeqLike[A, S, S[A]])和跳过CanBuildFrom可以正常工作,但谁知道呢,因为我们必须猜测你为什么想要myAppend而不是仅仅:+开始。 -
@TravisBrown 更多背景信息:我正在致力于移植/改进 ScalaPB 的镜头功能。我想为
Seq-ish 的字段提供一个扩展方法,它提供了对字段的修改:github.com/scalapb/ScalaPB/blob/…。我编辑了问题以阐明我的要求:asInstanceOf安全吗?我们可以在任何R上而不是S[A]s 上操作吗? -
您是否使用docs.scala-lang.org/overviews/core/… 作为您的向导?它最近才出现在网站上
-
@SethTisue - 是的,这是一本很棒的书。但是,在这种情况下,我在实施这些想法时遇到了一些问题:如果我同时得到
IsSeq和BuildFrom,我怎么能要求它们具有相同的A?BuildFrom.fromSpecific有一个似乎未使用的from参数 - 目前尚不清楚如何在这里使用BuildFrom以与调用:+具有相似的性能
标签: scala scala-2.13