Die übergabe der Funktion als block von code zwischen den geschweiften Klammern
Ein paar mal sah ich ein Scala-code so:
object Doer{
def doStuff(op: => Unit) {
op
}
}
Aufgerufen, in dieser Weise:
Doer.doStuff{
println("Done")
}
Was seltsam für mich ist, wie eine Funktion übergeben in eine andere Funktion, als nur einen block von code zwischen den geschweiften Klammern. Und es gibt auch keine Klammern, die normalerweise markieren den Anfang und das Ende der Argumentliste.
Was ist der name dieses Scala-syntax/Funktion? In welchen Fällen kann ich es verwenden? Wo ist es dokumentiert?
- Ich denke, es ist nur syntaktischer Zucker. Die Runden Klammern sind nicht hier, weil du weglassen können Runde Klammern, wenn die Funktion nur ein argument. Und das Stück code innerhalb der geschweiften Klammern ist die Möglichkeit, eine anonyme Funktion.
- Nein. Sie können rufen Sie
f(args)
oderf {block}
aber man kann Sie nicht weglassen der Satzzeichen, außer als infixx op y
. Der block ist ein anon nur Spaß, wie{ case x => }
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies nennt man entweder eine nullary Funktion oder eine thunk, und ist ein Beispiel für call-by-name evaluation: http://www.scala-lang.org/old/node/138
Können Sie nullaries so ziemlich überall haben Sie eine parameter-Liste. Sie sind im Grunde nur syntaktischer Zucker, um die null-argument-Funktionen, die machen Sie Aussehen wie die normalen Werte, und werden aufgerufen, wenn auf Sie verwiesen wird.
So
ist genau das gleiche wie:
Die eine Sache im Auge zu behalten, mit nullaries ist Sie aufgerufen werden, jedes mal, wenn auf Sie verwiesen wird, so etwas wie:
wird print "foo" zweimal.
Bearbeiten: erweitern auf Randall ' s Kommentar, eine der großen Möglichkeiten, die zu einem nullary Funktion unterscheidet sich von einer null-arg-Funktion ist, dass nullaries sind nicht die erste-Klasse-Werte. Zum Beispiel können Sie eine
List[() => Int]
aber man kann nicht eineList[=> Int]
. Und wenn Sie so etwas wie:sind Sie nicht hinzufügen die nullary Funktion auf der Liste, nur Ihr Rückgabewert.
Function
den Wert an, der gespeichert oder weitergereicht. Sie können nur auslösen, Auswertungen des tatsächlichen Arguments Ausdruck (viele von Ihnen).def f(op: =>Int) = op _
und auchdef g(op: =>Int) = f(op)
, sog(8)
nicht eval. Mit anderen Worten: eine call-by-name-Parameter ist eine parameterlose Methode geben, wiedef x
.=>A
in 3.3.1 als expr, dass ist eval würde jedes mal, wenn es auf die verwiesen wird, dasselbe als ein by-name-Parameter. (Für mich, das hilft mir nicht denken, wie es implementiert ist, oder kodiert ist.)nullary
vszero-arg
? Wikipedia schlägt vor, Sie sind die gleiche Sache.