gpt4 book ai didi

scala - 尝试扩展通用数组

转载 作者:行者123 更新时间:2023-12-01 08:41:03 28 4
gpt4 key购买 nike

我很确定这在 Scala 中非常简单,但我似乎无法弄清楚类型系统需要哪些提示才能使其工作。

我想要一个抽象的 Printable 类,然后隐式地将其他类转换为它。更具体地说,我想将 Byte 隐式转换为 Printable 并将 Array[Byte] 转换为 Printable。

所以我这样做了:

abstract class Printable{
def print():String
}
class PrintableByte(b:Byte) extends Printable{
def print() = "" /*return something*/
}
implicit def printableByte(b:Byte) = new PrintableByte(b)

class PrintableArray(a:Array[Printable]) extends Printable{
def print() = {
for(i <- 0 until a.length) a(i).print() // no problems here
"" /*return something*/
}
}
implicit def printableArray(a:Array[Printable]) = new PrintableArray(a)

但是:

val b:Byte = 0
b.print() //no problem here
val a= new Array[Byte](1024)
a.print() //error: value print() is not a member of Array[Byte]

我希望类型系统能够理解 Array[Byte] 隐含地是 Array[Printable] 并且隐含地是 Printable。

我错过了什么?

最佳答案

只要我的两分钱:

abstract class Printable{
def print: String
}

class PrintableArray[T <% Printable](a: Array[T]) extends Printable{
def print = (for(x <- a) yield x.print) mkString
}
implicit def printableArray[T <% Printable](a: Array[T]) = new PrintableArray(a)

class PrintableByte(b: Byte) extends Printable{
def print = "%#02x" format b
}
implicit def printableByte(b:Byte) = new PrintableByte(b)

class PrintableInt(i: Int) extends Printable{
def print = "%#08x" format i
}
implicit def printableInt(i: Int) = new PrintableInt(i)

然后:

scala> val b: Byte = -1
b: Byte = -1

scala> val i: Int = 100
i: Int = 100

scala> val bArr = Array[Byte](11,22,33,44)
bArr: Array[Byte] = Array(11, 22, 33, 44)

scala> val iArr = Array[Int](111111,222222,333333,444444)
iArr: Array[Int] = Array(111111, 222222, 333333, 444444)

scala> b print
res0: String = 0xff

scala> i print
res1: String = 0x000064

scala> bArr print
res2: String = 0xb0x160x210x2c

scala> iArr print
res3: String = 0x01b2070x03640e0x0516150x06c81c

scala>

关于scala - 尝试扩展通用数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3158983/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com