gpt4 book ai didi

scala - 将类型模式匹配转换为类型类

转载 作者:行者123 更新时间:2023-12-03 23:07:31 24 4
gpt4 key购买 nike

我有以下代码:

val byteBuffer = array(0) match {
case _: Int =>
ByteBuffer.allocate(4 * array.length)
case _: Long =>
ByteBuffer.allocate(8 * array.length)
case _: Float =>
ByteBuffer.allocate(4 * array.length)
case _: Double =>
ByteBuffer.allocate(8 * array.length)
case _: Boolean =>
ByteBuffer.allocate(1 * array.length)
}

如何将其转换为使用类型类?

编辑:

有人问我数组的类型是什么。情况很复杂。该数组声明如下:
val array = obj.asInstanceOf[mutable.WrappedArray[Any]].array

obj 是函数接受的参数:
val createBuffer = (obj: Any, dType: DataType) => dType match {

该函数在此处调用:
val byteBuffer: Option[ByteBuffer] = createBuffer(row.get(i), types(i))

row 是 Spark DataFrame 行。

最佳答案

A typeclass 看起来像这样:

trait ByteSize[T] {
def tSize: Int
}

object ByteSize {
implicit final val IntByteSize: ByteSize[Int] =
new ByteSize[Int] {
override final val tSize: Int = 4
}

implicit final val LongByteSize: ByteSize[Long] =
new ByteSize[Long] {
override final val tSize: Int = 8
}

// Other instances.
}

object syntax {
object bytes {
implicit class ArrayOps[T](private val arr: Array[T]) extends AnyVal {
final def allocateByteBuffer(implicit ev: ByteBuffer[T]): ByteBuffer =
ByteBuffer.allocate(ev.tSize * array.length)
}
}
}

您可以像这样使用:
import syntax.bytes._

val arr: Array[Int] = ???

val byteBuffer = arr.allocateByteBuffer

你甚至可以提供更多有用的扩展方法,比如不仅仅是分配 字节缓冲区 ,可以直接填写。

注意,切记 类型类 是类型驱动的,因此在编译时解析。
如果您不知道数组的类型,那么该模式匹配是您能做的最好的事情。
你可能想看看你是否可以重构你的代码,使它成为更强大的类型,因为 任意 ,通常被认为是代码异味。但是,如果你不能或者它的好处太多,那么类型类就是错误的工作工具。

关于scala - 将类型模式匹配转换为类型类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61443874/

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