Quelle est exactement la différence entre: et p> semble que dans les deux cas, je me retrouve avec une variable < Code> FOO code> que je peux me référer à Sans parenthèses, toujours évaluer à 5 code>. p> p>
5 Réponses :
Qu'est-ce que cela signifie quand j'utilise def pour définir un champ à Scala P>
Vous ne pouvez pas définir un champ à l'aide de
def code>. p>semble que dans les deux cas, je me retrouve avec une variable FOO que je peux me référer à Sans parenthèse, toujours en évaluant à 5. p> blockQuote>
Non, dans les deux cas, vous vous retrouvez avec une méthode em>
foo code>, que vous pouvez appeler sans parenthèses. p>pour voir Vous pouvez utiliser
javap code>: p>xxx pré> Cependant, voir http://tommy.chheng.com/index.php/2010/03 / quand des méthodes à appeler - avec-ou-sans-parenthèses-in-scala / p> blockquote>
Vous ne définissez pas une variable dans les deux cas. Vous définissez une méthode. La première méthode n'a pas de liste de paramètres, la seconde dispose d'une liste de paramètres, qui est vide. Le premier devrait être
appelé comme celui-ci tandis que la seconde doit être appelée comme ceci p> Cependant, le compilateur Scala vous permettra d'appeler des méthodes avec un vide Liste des paramètres sans parenthèses, la simple forme d'appel fonctionnera pour la deuxième méthode. Les méthodes sans paramètres ne peuvent pas être appelées avec les parenthèses p> Le style Scala préféré consiste à définir et à appeler des méthodes sans argument qui ont des effets secondaires avec les parenthèses. Les méthodes sans argument sans effets secondaires doivent être définies et appelées sans les parenthèses. P> Si vous définissez une variable, la syntaxe est p>
En réalité, SCALA vous permettra d'élier n'importe quel nombre de listes de paramètres vides (suivi)! Essayez def x () () () () () () () () () = 5 code>!
Avant toute autre chose est dit, Dans le second cas, vous pouvez omettre des parenthèses en raison d'une caractéristique spécifique de Scala. Il y a deux différences d'intérêt ici: une mécanique et une utilisation recommandée. P>
Commencer avec ce dernier, il est recommandé d'utiliser une liste de paramètres vide lorsqu'il y a des effets secondaires. Un exemple classique est Maintenant, en tant que différence pratique - au-delà de possibles mélanges syntaxiques étranges dans des cas d'angle (je ne dis pas qu'il y ait, il suffit de conjecturer) - des types de structure doivent suivre la convention correcte. P>
Par exemple, def code> ne définit pas de champ, il définit une méthode. P>
fermeture () code>. Vous omettez des parenthèses s'il n'y a pas d'effets secondaires pour appeler l'élément. P>
source code> avait un Fermer la méthode sans parenthèse, ce qui signifie un type structurel de def fermeture (): unité code> n'accepterait pas < code> source code>. De même, si je définis une méthode structurelle que défaire de défile: unité code>, alors java observe code> Les objets ne seront pas acceptés. P>
En outre aux réponses déjà données, j'aimerais souligner deux points: P>
La possibilité de définir des méthodes sans paramètre est un moyen de réaliser le Principe d'accès uniforme . Cela permet de cacher la différence entre les champs et les méthodes, ce qui facilite la mise en œuvre ultérieure. P> LI>
Vous pouvez appeler une méthode définie comme def fio () = 5 code> à l'aide de FOO code>, mais vous ne peut pas forte> appeler un Méthode définie comme def foo = 5 code> en utilisant foo () code> p> li>
ul>
Je suis surpris que personne ne mentionne quoi que ce soit sur la différence de paresse.
Tandis que Val code> est évalué une seule fois au moment de la définition, def code> est évalué uniquement lorsque nous l'accédez et que nous l'avons évalué à chaque fois. Voir l'exemple ci-dessous: scala> def foo = {
| println("hi")
| 5
| }
foo: Int
scala> val onlyOnce = foo
scala> def everyTime = foo
scala> onlyOnce
res0: Int = 5
scala> onlyOnce
res1: Int = 5
scala> everyTime
hi
res2: Int = 5
scala> everyTime
hi
res3: Int = 5