如何丰富包对象?

时间:2015-05-19 23:24:46

标签: scala enrich-my-library

我最近发现可以使用 Pimp Enrich My Library模式使用restore:向伴随对象添加方法:

.type

不幸的是,对于像object Whatever { } implicit class WhateverExtensions(val obj: Whatever.type) { def greet = println("Hi!") } Whatever.greet 这样的包对象来说,它似乎不起作用:

scala.math

我收到以下编译错误:

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 {
                                                 ^

是否可以丰富包对象?

1 个答案:

答案 0 :(得分:9)

虽然文档非常薄,但我并不认为这种方式是可行的。编译器显然不同于单例处理它。即使编译了该方法,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))

}