2016-03-15 4 views

Antwort

22

Yep, mit der wenig dokumentierten scala.Singleton Typ:

def isSingleton[A](a: A)(implicit ev: A <:< Singleton = null) = 
    Option(ev).isDefined 

Und dann:

scala> val X = new Foo(10) 
X: Foo = [email protected] 

scala> object Y extends Foo(11) 
defined object Y 

scala> isSingleton(X) 
res0: Boolean = false 

scala> isSingleton(Y) 
res1: Boolean = true 

Meine isSingleton Methode ist nur eine Demonstration, die eine Laufzeit boolean Wert liefert, die Sie, ob oder nicht erzählt Ein Ausdruck wird statisch als Singletontyp typisiert, aber Sie können auch Singleton als Beweis zur Kompilierzeit verwenden, dass ein Typ ein Singletontyp ist.

+0

Warum nicht 'null' ev ne anstelle von' Option (ev) .isDefined'? – Clashsoft

+0

@Clashsoft Kein besonderer Grund. Der 'Null'-Standardwert ist eine Art Hack, und da es nicht wirklich der Punkt ist, wollte ich die Dinge nur so prinzipiell wie möglich halten. –

+0

Sind Sie sicher, dass "scala.Singleton" (noch) existiert? Es ist nicht in der '2.11' Dokumentation, und es ist auch nicht im GitHub Repo zu finden? Vielleicht könntest du einen Link hinzufügen – Clashsoft

Verwandte Themen