Type Classe 实现的最佳语法
Type Classe implementation best syntax
在为我们的类型实现类型类时,我们可以使用不同的语法(例如 implicit val
或 implicit object
)。例如:
类型类定义:
trait Increment[A] {
def increment(value: A): A
}
而且,据我所知,我们可以通过以下两种方式为 Int
实现它:
implicit val fooInstance: Increment[Int] = new Increment[Int] {
override def increment(value: Int): Int = value + 1
}
// or
implicit object fooInstance extends Increment[Int] {
override def increment(value: Int): Int = value + 1
}
我总是使用第一个,因为 Scala 2.13 的缩写语法如下所示:
implicit val fooInstance: Increment[Int] = (value: Int) => value + 1
但是,它们之间有什么真正的区别吗?或者有什么建议或标准可以做到这一点?
有一个 ,但我更关注如何创建(最佳实践)类型类实例,而不是隐式转换
据我所知,差异是:
object
s 有不同的初始化规则 - 通常它们会被延迟初始化(如果你不在构造函数中执行副作用也没关系)
- 它也与 Java 不同(但同样,您可能不会注意到 Scala 中的差异)
object X
将有一个 X.type
类型,它是任何 X
扩展或实现的子类型(但隐式解析会发现它扩展了你的类型类,尽管可能有一点更多努力)
所以,我看不出实际使用有什么不同,但是 implicit val
版本可以产生更少的 JVM 垃圾(我说垃圾是因为你不会在这方面使用任何额外的编译器工作具体情况)。
在为我们的类型实现类型类时,我们可以使用不同的语法(例如 implicit val
或 implicit object
)。例如:
类型类定义:
trait Increment[A] {
def increment(value: A): A
}
而且,据我所知,我们可以通过以下两种方式为 Int
实现它:
implicit val fooInstance: Increment[Int] = new Increment[Int] {
override def increment(value: Int): Int = value + 1
}
// or
implicit object fooInstance extends Increment[Int] {
override def increment(value: Int): Int = value + 1
}
我总是使用第一个,因为 Scala 2.13 的缩写语法如下所示:
implicit val fooInstance: Increment[Int] = (value: Int) => value + 1
但是,它们之间有什么真正的区别吗?或者有什么建议或标准可以做到这一点?
有一个
据我所知,差异是:
object
s 有不同的初始化规则 - 通常它们会被延迟初始化(如果你不在构造函数中执行副作用也没关系)- 它也与 Java 不同(但同样,您可能不会注意到 Scala 中的差异)
object X
将有一个X.type
类型,它是任何X
扩展或实现的子类型(但隐式解析会发现它扩展了你的类型类,尽管可能有一点更多努力)
所以,我看不出实际使用有什么不同,但是 implicit val
版本可以产生更少的 JVM 垃圾(我说垃圾是因为你不会在这方面使用任何额外的编译器工作具体情况)。