如何将 Builder 方法添加到 Scala 中的自定义 IndexedSeq?
How do I add Builder methods to a custom IndexedSeq in Scala?
作为一个简化的例子,假设我想设置一个 IndexedSeq,它是专门为使用整数而键入的,如下所示:
class IntSeq private(val ints: Seq[Int], val length: Int) extends IndexedSeq[Int]{
def apply(idx: Int): Int = {
if(idx < 0 || idx >= length) throw new IndexOutOfBoundsException
ints(idx)
}
}
object IntSeq {
def fromSeq(seq: Seq[Int]): IntSeq = new IntSeq(seq, seq.length)
def apply(ints: Int*): IntSeq = fromSeq(ints)
}
从表面上看,这段代码似乎在以下意义上起作用:
val intSeq = IntSeq(1, 2)
intSeq(1) // correctly returns the 2
但是,如果我随后尝试使用以下方法扩展此 IntSeq:
intSeq + 3
我会得到以下错误:
type mismatch;
found : Int(3)
required: String
我可以看出这是因为 + 方法实际上来自 Predef 对象,这可能不是我所期望的。
IntSeq 缺少哪些允许使用 Builder 函数的内容?
我需要添加/定义一个生成器吗?
我该怎么做?
这是因为不可变的 IndexedSeq 或 Seq 通常没有 +
方法。它只有 :+
和 +:
,因为您可以将其附加到 Seq.
作为一个简化的例子,假设我想设置一个 IndexedSeq,它是专门为使用整数而键入的,如下所示:
class IntSeq private(val ints: Seq[Int], val length: Int) extends IndexedSeq[Int]{
def apply(idx: Int): Int = {
if(idx < 0 || idx >= length) throw new IndexOutOfBoundsException
ints(idx)
}
}
object IntSeq {
def fromSeq(seq: Seq[Int]): IntSeq = new IntSeq(seq, seq.length)
def apply(ints: Int*): IntSeq = fromSeq(ints)
}
从表面上看,这段代码似乎在以下意义上起作用:
val intSeq = IntSeq(1, 2)
intSeq(1) // correctly returns the 2
但是,如果我随后尝试使用以下方法扩展此 IntSeq:
intSeq + 3
我会得到以下错误:
type mismatch;
found : Int(3)
required: String
我可以看出这是因为 + 方法实际上来自 Predef 对象,这可能不是我所期望的。
IntSeq 缺少哪些允许使用 Builder 函数的内容? 我需要添加/定义一个生成器吗? 我该怎么做?
这是因为不可变的 IndexedSeq 或 Seq 通常没有 +
方法。它只有 :+
和 +:
,因为您可以将其附加到 Seq.