Pregunta ¿Cómo enriquezco un objeto de paquete?


Recientemente descubrí que uno puede usar el Chulo Enriquezca mi patrón de Biblioteca para agregar métodos a objetos complementarios usando .type:

object Whatever { }

implicit class WhateverExtensions(val obj: Whatever.type) {
    def greet = println("Hi!")
}

Whatever.greet

Desafortunadamente, lo mismo no parece funcionar para objetos de paquete como scala.math:

implicit class MathExtensions(val obj: scala.math.type) {
    def min(x: Money, y: Money): Money = ???
}

Obtengo el siguiente error de compilación:

Error: (153, 47) tipo desajuste;
 encontrado: math.type
 requerido: AnyRef
Tenga en cuenta que math extends Any, not AnyRef.
Dichos tipos pueden participar en clases de valor, pero las instancias
no puede aparecer en tipos singleton o en comparaciones de referencia.
    clase implícita MathExtensions (val obj: scala.math.type) extiende AnyVal {
                                                 ^

¿Es posible enriquecer un objeto de paquete?


9
2018-05-19 23:24


origen


Respuestas:


No creo que sea posible de esa manera, aunque la documentación es extremadamente delgada. El compilador claramente lo trata de manera diferente a un singleton. Incluso si ese método compilado, import scala.math._ haría ciertamente no importa tu min método, ya que no hay nada que active la conversión implícita. Y bueno, si math.customMin era posible, eso requeriría dos importaciones.

Eso es posible de otra manera. Podemos definir todo lo que queremos en el scala.math paquete. Sin embargo, no podemos definir métodos en el nivel superior, por lo que debemos emplear algún truco de objeto para que funcione.

package scala.math

object intMin extends ((Int, Int) => Int) {
    def apply(x: Int, y: Int): Int = x + y
}

Alguna prueba:

import scala.math._

object Test extends App {

    println(intMin(4, 10))

}

9
2018-05-20 01:00