En passant de la fonction en tant que bloc de code entre accolades
Quelques fois, j'ai vu un Scala code comme ça:
object Doer{
def doStuff(op: => Unit) {
op
}
}
Invoquée de cette façon:
Doer.doStuff{
println("Done")
}
Ce qui est étrange pour moi, c'est la façon dont une fonction est passé à une autre fonction que seulement un bloc de code entre accolades. Et il n'y a pas de parenthèses, qui normalement marquer le début et la fin de la liste d'arguments.
Quel est le nom de Scala syntaxe/fonction? Dans ce cas, je peux l'utiliser? Où est-il documenté?
- Je pense que c'est juste un sucre syntaxique. La ronde des parens ne sont pas ici, parce que vous pouvez omettre ronde parens si la fonction n'a qu'un seul argument. Et le morceau de code à l'intérieur d'accolades est la façon de fournir une fonction anonyme.
- Pas de. Vous pouvez appeler
f(args)
ouf {block}
mais vous ne pouvez pas omettre le signe de ponctuation à l'exception comme infixex op y
. Le bloc est un anon amuser comme{ case x => }
.
Vous devez vous connecter pour publier un commentaire.
Cela s'appelle un nullary fonction ou un thunk, et est un exemple de en appel par le nom de l'évaluation: http://www.scala-lang.org/old/node/138
Vous pouvez utiliser nullaries peu près n'importe où vous avez une liste de paramètres. Ils sont tout simplement de sucre syntaxique autour de zéro argument des fonctions qui les font ressembler à des valeurs ordinaires, et sont appelés à chaque fois qu'ils sont référencés.
Donc
est exactement la même chose que:
La seule chose à garder à l'esprit nullaries, c'est qu'ils sont invoqués à chaque fois qu'ils sont référencés, donc quelque chose comme:
affiche "foo" deux fois.
Modifier: Pour se développer sur de Randall commentaire, l'un des grands moyens qu'un nullary fonction est différente de zéro la fonction arg, c'est que nullaries ne sont pas des valeurs de première classe. Par exemple, vous pouvez avoir un
List[() => Int]
mais vous ne pouvez pas avoir unList[=> Int]
. Et si vous aviez quelque chose comme:vous n'êtes pas d'ajouter le nullary fonction de la liste, uniquement de sa valeur de retour.
Function
de la valeur à être stockées ou échangées. Vous ne pouvez déclencher des évaluations de l'argument réel de l'expression (n'importe quel nombre d'entre eux).def f(op: =>Int) = op _
et aussidef g(op: =>Int) = f(op)
, doncg(8)
n'a pas d'eval. D'autres mots: un appel par nom param est une méthode sans paramètre de type, commedef x
.=>A
dans 3.3.1 une expr est eval avais à chaque fois qu'il est référencé, même en tant que sous-nom du param. (Pour moi, qui m'a aidé à ne pas penser à la façon dont il est mis en œuvre ou codés.)nullary
vszero-arg
? Wikipédia suggère qu'ils sont la même chose.