Ich kluge oder nicht, ich schreibe eine Methode, die ich nur Scala-Singletons akzeptieren möchte, d. h. Objekte, die über "Objekt" statt konstruierter Instanzen einer Klasse oder eines Merkmals implementiert werden. Es sollte Scala-Singletons eines beliebigen Typs akzeptieren, also wird "MySingleton.type" nicht ausreichen.
Ich stieß auf das sehr seltsame Konstrukt "scala.Singleton", das in den api docs nicht dokumentiert ist, aber anscheinend den Trick macht:
%Vor%Allerdings, für mich eher unerklärlich, werden String-Literale als Singletons akzeptiert, während explizit konstruierte Strings nicht:
sind %Vor%Warum entsprechen String-Literale Singleton? Missverstehe ich, was der Singleton-Typ angeben soll?
Erstens, was ist ein Singleton-Typ? Wenn Sie der Ansicht sind, dass ein Typ eine Menge von Werten ist, ist ein Singletontyp eine Menge mit genau einem Element.
Am häufigsten kann ein Objekt der obersten Ebene eine solche Menge bewohnen.
%Vor%Allgemeiner und stabiler -Wert kann einen Singletontyp bilden.
%Vor% Wenn y
ein def
oder ein var
ist, wird es nicht länger qualifiziert, da der Wert im Laufe der Zeit möglicherweise nicht derselbe ist. Daher kann der Compiler nicht garantieren, dass der Singletontyp one-and-class klassifiziert. Nur ein Wert.
Eine weitere Einschränkung: AnyVal
s kann keine Singletontypen bilden, da die Sprachspezifikation sie speziell auf AnyRef
beschränkt.
Paul Phillips kuratierte einen Zweig , mit dem Sie einen Singletontyp für Literale ausdrücken können.
> %Vor% Soweit ich das beurteilen kann, qualifiziert sich jede unveränderliche Referenz in diesem Zusammenhang als Singleton, nicht nur als Strings. Sie können beispielsweise invoke check(5)
oder val foo = List(1,2,3); check(foo)
verwenden. var bar = List(1,2,3); check(bar)
wird jedoch nicht funktionieren.
Nach diesem Verhalten würde ich annehmen, dass eine Referenz als Singleton betrachtet wird, wenn der Compiler feststellen kann, dass er sich niemals ändert (oder in diesem Kontext "final" ist).
Ich denke, der einfachste Hinweis stammt aus Kapitel 3 in der Scala-Referenz, Abschnitt 3.2.1:
Ein Singletontyp hat die Form p.type, wobei p ein Pfad ist, der auf a zeigt erwarteter Wert (§6.1) an scala.AnyRef. Der Typ bezeichnet die Menge von Werten bestehend aus Null und dem Wert, der mit p bezeichnet wird.
Ein stabiler Typ ist entweder ein Singletontyp oder ein deklarierter Typ ein Untertyp der Eigenschaft scala.Singleton sein.
Das Konzept der stabilen Typen ist wichtig, und das Merkmal macht es möglich, Dinge als stabil zu bezeichnen, die sonst nicht berücksichtigt würden.
Tags und Links scala