2016-03-15 10 views

Odpowiedz

22

Tak, używając mało udokumentowane scala.Singleton typ:

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

, a następnie:

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 

Moja isSingleton metoda jest tylko wykazanie, że dostarcza wartość Runtime logiczną, która mówi, czy też nie wyrażenie jest statycznie wpisywane jako typ singleton, ale można także użyć Singleton jako dowodu podczas kompilacji, że typ jest typem singleton.

+0

Dlaczego nie użyć 'ev ne null' zamiast' Option (EV) .isDefined'? – Clashsoft

+0

@Clashsoft Brak konkretnego powodu. Wartość domyślna 'null' jest typem hackowania, a ponieważ tak naprawdę nie jest to kwestia, chciałem po prostu zachować inne zasady, jak to tylko możliwe. –

+0

Co więcej, jesteś pewien, że 'scala.Singleton' (nadal) istnieje? Nie ma go w dokumentacji "2.11" i nie można go znaleźć również w repozytorium GitHub? Może mógłbyś dodać link? – Clashsoft

Powiązane problemy