2015-05-19 5 views
8

Ich habe kürzlich entdeckt, dass man die Pimp Bereichern My Library Muster Methoden Begleiter .type Objekte mit hinzufügen kann:Wie richte ich ein Paketobjekt an?

object Whatever { } 

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

Whatever.greet 

Leider das gleiche scheint wie nicht scala.math für Paket-Objekte:

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

erhalte ich die folgende Compiler-Fehler:

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

Kann ein Paketobjekt angereichert werden?

Antwort

8

Ich glaube nicht, dass es auf diese Weise möglich ist, obwohl die Dokumentation extrem dünn ist. Der Compiler behandelt das klar anders als ein Singleton. Selbst wenn diese Methode kompiliert würde import scala.math._sicherlich nicht importieren Sie Ihre min Methode, da es nichts gibt, um die implizite Konvertierung auszulösen. Und wenn math.customMin möglich wäre, würde das zwei Importe erfordern.

Es ist auf andere Weise möglich. Wir können alles, was wir wollen, im Paket scala.math definieren. Wir können jedoch keine Methoden auf oberster Ebene definieren, daher müssen wir einige Objekttricks anwenden, damit es funktioniert.

package scala.math 

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

Einige Test:

import scala.math._ 

object Test extends App { 

    println(intMin(4, 10)) 

} 
+1

gar nicht viel in der Dokumentation: http://www.scala-lang.org/files/archive/spec/2.11/09-top-level- Definitionen.html # Paket-Objekte. Es scheint unmöglich zu sein, den Typ dieser Sache zu bekommen: 'type T = '' math''.type gibt "Error: (5, 12) stable identifier erforderlich, aber scala. gefunden. type T =' math'. Art". –

+0

Siehe auch: http://www.scala-lang.org/docu/files/packageobjects/packageobjects.html –