如何丰富包对象?
How do I enrich a package object?
我最近发现可以使用 Pimp Enrich My Library 模式来使用 .type
:
向伴随对象添加方法
object Whatever { }
implicit class WhateverExtensions(val obj: Whatever.type) {
def greet = println("Hi!")
}
Whatever.greet
不幸的是,同样的方法似乎不适用于 scala.math
:
这样的包对象
implicit class MathExtensions(val obj: scala.math.type) {
def min(x: Money, y: Money): Money = ???
}
我收到以下编译器错误:
Error:(153, 47) type mismatch;
found : math.type
required: AnyRef
Note that math extends Any, not AnyRef.
Such types can participate in value classes, but instances
cannot appear in singleton types or in reference comparisons.
implicit class MathExtensions(val obj: scala.math.type) extends AnyVal {
^
是否可以丰富包对象?
我认为以这种方式不可能,尽管文档非常薄。编译器显然以不同于单例的方式对待它。即使该方法已编译,import scala.math._
也不会 肯定不会 导入您的 min
方法,因为没有任何东西可以触发隐式转换。好吧,如果 math.customMin
是可能的,那将需要两次导入。
它是另一种可能。我们可以在 scala.math
包中定义任何我们想要的东西。但是,我们不能在顶层定义方法,所以我们需要使用一些对象技巧来使其工作。
package scala.math
object intMin extends ((Int, Int) => Int) {
def apply(x: Int, y: Int): Int = x + y
}
一些测试:
import scala.math._
object Test extends App {
println(intMin(4, 10))
}
我最近发现可以使用 Pimp Enrich My Library 模式来使用 .type
:
object Whatever { }
implicit class WhateverExtensions(val obj: Whatever.type) {
def greet = println("Hi!")
}
Whatever.greet
不幸的是,同样的方法似乎不适用于 scala.math
:
implicit class MathExtensions(val obj: scala.math.type) {
def min(x: Money, y: Money): Money = ???
}
我收到以下编译器错误:
Error:(153, 47) type mismatch; found : math.type required: AnyRef Note that math extends Any, not AnyRef. Such types can participate in value classes, but instances cannot appear in singleton types or in reference comparisons. implicit class MathExtensions(val obj: scala.math.type) extends AnyVal { ^
是否可以丰富包对象?
我认为以这种方式不可能,尽管文档非常薄。编译器显然以不同于单例的方式对待它。即使该方法已编译,import scala.math._
也不会 肯定不会 导入您的 min
方法,因为没有任何东西可以触发隐式转换。好吧,如果 math.customMin
是可能的,那将需要两次导入。
它是另一种可能。我们可以在 scala.math
包中定义任何我们想要的东西。但是,我们不能在顶层定义方法,所以我们需要使用一些对象技巧来使其工作。
package scala.math
object intMin extends ((Int, Int) => Int) {
def apply(x: Int, y: Int): Int = x + y
}
一些测试:
import scala.math._
object Test extends App {
println(intMin(4, 10))
}