scala可以将2个隐式元素隐式连接到一个隐式元组中吗



上下文:
我正在尝试使用Java的RandomAccessFile,我希望能够使用隐式fixedBytable:读取/写入任何内容

case class FixedBytable[T](private val size: Int,
private val read: ByteBuffer => T,
private val write: (T, ByteBuffer) => Unit)

我为所有基本的byte/short/float/...定义了FixedBytable,它工作得很好。我还能够为所有元组类型定义tuple_Bytable,它可以将2个(或任何大小的元组(FixedBytable连接到1中,可以读取/写入"子"的元组(例如:FixedBytable[(Int, Int)].

问题:
你能含蓄地做到这一点吗?也许我说错了,但有没有办法说,如果你能隐式地找到FixedByable[A]FixedBytable[B],那么你应该知道如何隐式地寻找FixedBytable[(A, B)]

这是让我的问题发挥作用的解决方案,希望你能把它抽象到你的任何情况。
这里的关键是你需要在参数的开头同时使用implicit defimplicit

/*
Note:
implicit def
implicit b1: ...
*/
implicit def tuple2Bytable[T1, T2](implicit b1: Bytable[T1], b2: Bytable[T2]): Bytable[(T1, T2)] =
Bytable[(T1, T2)](
b1.size + b2.size,
bb => {
val v1: T1 = b1.fromBytes(bb)
val v2: T2 = b2.fromBytes(bb)
(v1, v2)
},
(t, bb) => {
b1.toBytes(t._1, bb)
b2.toBytes(t._2, bb)
}
)
implicit def tuple3Bytable[T1, T2, T3](implicit b1: Bytable[T1], b2: Bytable[T2], b3: Bytable[T3]): Bytable[(T1, T2, T3)] =
Bytable[(T1, T2, T3)](
b1.size + b2.size + b3.size,
bb => {
val v1: T1 = b1.fromBytes(bb)
val v2: T2 = b2.fromBytes(bb)
val v3: T3 = b3.fromBytes(bb)
(v1, v2, v3)
},
(t, bb) => {
b1.toBytes(t._1, bb)
b2.toBytes(t._2, bb)
b3.toBytes(t._3, bb)
}
)

最新更新