Es gibt einige Diskussionen hierüber, aber ich habe einige spezifische Fragen, auf die ich keine Antwort finden konnte. Also, bei call-by-name meine ich =>T
type und bei 0-arity function meine ich () => T
Ich verstehe (denke ich) den konzeptionellen Unterschied, aber wahrscheinlich vermisse ich etwas, da ich noch viele Fragen habe:
=>T
, wenn wir immer () => T
verwenden könnten? =>
nicht als Klassenfeld verwendet werden kann. Ist das die einzige Einschränkung? =>T
bevorzugen? Und warum? =>T
als Typ anzugeben? Es sieht für mich so aus, als hätte es in scala keine Typendarstellung. 1) Es ist einfach praktischer, es zu benutzen, besonders innerhalb von DSLs:
%Vor% 2) => T
kann nur ein Parameter der Methode oder Funktion sein. Und tatsächlich sind => T
und () => T
nicht austauschbar:
Danke an @ som-snytt, für diesen:
%Vor%Auch das sollte funktionieren, wenn es kompiliert wird - aber nicht (scala 2.11.2, 2.11.5 REPL stürzt einfach ab):
%Vor%Der letzte scheint wie ein Fehler
3) Nicht genau, wenn Sie das gleiche wollen, konvertieren Sie => T
in () => T
:
Bytecode kann auch abweichen. Zum Beispiel wird der Compiler eher Code aus => T
inline schreiben, ohne dafür Lambda zu erzeugen. Der entscheidende Unterschied ist also, dass () => T
tatsächlich ein Objekt ist (Bürger erster Klasse), => T
nicht.
4) siehe 1, aber manchmal müssen Sie möglicherweise sicherstellen, dass der Benutzer weiß, dass die Berechnung möglicherweise verzögert wird - () => T
ist dann besser.
5) Es ist Teil einer Typ-Signatur, schaue dir einfach eta-expansion von:
an %Vor%Scala erkennt es jedoch nicht als unabhängigen Typ:
%Vor%Tags und Links scala