2015-05-19 29 views
8

di recente ho scoperto che si può usare il Pimp arricchire la mia biblioteca modello per aggiungere metodi alle compagno oggetti usando .type:Come si arricchisce un oggetto pacchetto?

object Whatever { } 

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

Whatever.greet 

Purtroppo lo stesso non sembra funzionare per gli oggetti del pacchetto come scala.math:

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

ottengo il seguente errore di compilatore:

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

È possibile arricchire un oggetto pacchetto?

risposta

8

Non credo sia possibile in questo modo, anche se la documentazione è estremamente sottile. Il compilatore lo sta trattando in modo diverso rispetto a un singleton. Anche se questo metodo è stato compilato, import scala.math._non è sicuramente importare il tuo metodo min, poiché non c'è nulla per attivare la conversione implicita. E bene, se math.customMin fosse possibile, ciò richiederebbe due importazioni.

E è possibile in un altro modo. Possiamo definire tutto ciò che vogliamo nel pacchetto scala.math. Tuttavia, non possiamo definire i metodi al livello più alto, quindi è necessario utilizzare alcuni trucchi sugli oggetti per farlo funzionare.

package scala.math 

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

Alcuni di prova:

import scala.math._ 

object Test extends App { 

    println(intMin(4, 10)) 

} 
+1

Non molto nella documentazione a tutti: http://www.scala-lang.org/files/archive/spec/2.11/09-top-level- definitions.html # pacchetto-oggetti. Sembra impossibile ottenere il tipo di quella cosa: 'tipo T = '' math''.type' restituisce "Errore: (5, 12) identificatore stabile richiesto, ma scala trovato. tipo T =' matematica'. genere". –

+0

Vedi anche: http://www.scala-lang.org/docu/files/packageobjects/packageobjects.html –

Problemi correlati