scala - 如何丰富包对象?

标签 scala enrich-my-library

我最近发现可以使用 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))

}

关于scala - 如何丰富包对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30337805/

相关文章:

scala - 如何在 Play/Scala 应用程序中声明对 Cassandra 驱动程序的依赖?

scala - 如何访问 Spark UDF 函数中的完整 Row?

java - 有没有一种方法可以将零个或多个多个规则模式组合到 Antlr4 的一个列表中?

scala - sbt 网络插件 : Not a valid key: jetty-run (similar: jetty-port, 码头上下文,运行)

java - 在 lift 框架中添加更多页面和 .scala 类

scala - 在scala中使用“丰富我的图书馆”的最佳方法是什么?

scala - 如何将基于交叉产品的方法添加到 Scala 集合?