Bri*_*don 9 scala enrich-my-library
我最近发现可以使用Pimp Enrich My Library模式使用.type
以下方法向伴随对象添加方法:
object Whatever { }
implicit class WhateverExtensions(val obj: Whatever.type) {
def greet = println("Hi!")
}
Whatever.greet
Run Code Online (Sandbox Code Playgroud)
不幸的是,这似乎不适用于包对象,如scala.math
:
implicit class MathExtensions(val obj: scala.math.type) {
def min(x: Money, y: Money): Money = ???
}
Run Code Online (Sandbox Code Playgroud)
我得到以下编译器错误:
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
}
Run Code Online (Sandbox Code Playgroud)
一些测试:
import scala.math._
object Test extends App {
println(intMin(4, 10))
}
Run Code Online (Sandbox Code Playgroud)