我目前正在scala中使用我的网络库。我遇到过这样的事情:
object Packet {
trait Reader[T] {
def read(iterator: ByteIterator): T
}
object Reader {
implicit object ByteReader extends Reader[Byte] {
def read(iterator: ByteIterator): Boolean = iterator.getByte
}
}
}
class Packet {
import Packet._
def iterator: ByteIterator
def read[T](implicit e: Reader[T]): T = {
e.read[T]()
}
def readByte(): Byte = {
this.read[Byte]() // <- Unspecified value parameter e
}
}
当我在网上搜索答案时,我读到的所有例子都是关于函数WITH参数,而不是像我,我的&#34;阅读&#34; function取0参数。这是问题吗?我该如何解决这个问题?
我来自C ++背景,知道Haskell的基本知识,就像类型类的东西一样。在C ++中,我可以进行模板专业化以使其工作。在Haskell中,(read :: Byte)
将起作用。我试图使用反射,但由于数据包读写是一个非常低级别的操作,反射应该对性能非常不利。有没有办法使这项工作?
答案 0 :(得分:1)
前置空参数列表:
def read[T]()(implicit e: Reader[T]): T =
e.read(iterator)
def readByte(): Byte =
this.read[Byte]() // <- HURRAY IT WORKS
在调用站点删除参数列表(()
)也有效,但通常不赞成,因为语法无参数调用应该是参考透明的。