186 votes

Groovy : ce qui ' s le but de « def » dans « def x = 0" ?

Dans la partie suivante du code (confirmé par le Guide de l’utilisateur Groovy), pourquoi le préfixe la cession avec le mot-clé def ?

Le mot-clé def peut être enlevé, et cet extrait produirait les mêmes résultats. Alors, quel est l’effet du mot-clé def ?

284voto

Ted Naleid Points 13349

C'est du sucre syntaxique pour les scripts de base. En omettant le "def" mot-clé met la variable dans les liaisons pour le script courant et groovy de la traite (pour la plupart) comme à l'échelle mondiale d'étendue variable:

x = 1
assert x == 1
assert this.binding.getVariable("x") == 1

En utilisant le mot-clé def au lieu de ne pas mettre les variables dans les scripts de liaisons:

def y = 2

assert y == 2

try {
    this.binding.getVariable("y") 
} catch (groovy.lang.MissingPropertyException e) {
    println "error caught"
}

Impressions: "erreur détectée"

En utilisant le mot-clé def dans les grands programmes est importante car elle permet de définir l'étendue dans laquelle la variable peut être trouvé et peut aider à préserver l'encapsulation.

Si vous définissez une méthode dans votre script, il n'aura pas accès aux variables qui sont créés avec "def" dans le corps du script principal qu'ils ne sont pas dans le champ d'application:

 x = 1
 def y = 2


public bar() {
    assert x == 1

    try {
        assert y == 2
    } catch (groovy.lang.MissingPropertyException e) {
        println "error caught"
    }
}

bar()

imprime "erreur détectée"

Le "y" à la variable n'est pas dans le champ d'application à l'intérieur de la fonction. "x" est portée comme groovy va vérifier les liaisons du script courant pour la variable. Comme je l'ai dit plus tôt, c'est simplement du sucre syntaxique pour faire rapide et sale de scripts plus rapide à taper (le plus souvent un doublures).

La bonne pratique dans les grandes scripts est de toujours utiliser le "def" mot clé de sorte que vous ne courez pas dans d'étranges questions de portée ou d'interférer avec les variables que vous ne souhaitez pas.

38voto

Michael Easter Points 7482

Ted réponse est excellente pour les scripts; Ben la réponse est la norme pour les classes.

Ben dit, il pense que "l'Objet" -- mais il est beaucoup plus frais en ce qu'il ne soit pas un obstacle à vous pour les méthodes de l'Objet. Cela a soigné implications en ce qui concerne les importations.

par exemple, Dans cet extrait de code que j'ai pour importer FileChannel

// Groovy imports java.io.* and java.util.* automatically
// but not java.nio.*

import java.nio.channels.*

class Foo {
    public void bar() {
        FileChannel channel = new FileInputStream('Test.groovy').getChannel()
        println channel.toString()
    }
}

new Foo().bar()

par exemple, Mais ici, je peux juste 'aile', tant que tout est dans le classpath

// Groovy imports java.io.* and java.util.* automatically
// but not java.nio.*
class Foo {
    public void bar() {
        def channel = new FileInputStream('Test.groovy').getChannel()
        println channel.toString()
    }
}

new Foo().bar()

31voto

Ben Hoffstein Points 44398

Selon cette page, def est un remplacement pour un nom de type et peut tout simplement être considéré comme un alias pour l’objet (c'est-à-dire ce qui signifie que vous ne se souciez du type).

5voto

Bill James Points 7554

En fait, je ne pense pas qu’il se comporterait les mêmes...

variables en Groovy nécessitent encore déclaration, juste pas TYPÉ, car le côté droit généralement contient suffisamment d’informations pour Groovy au type de la variable.

Lorsque j’essaie d’utiliser une variable que je n’ai pas déclaré avec def ou un type, je n’obtiens une erreur « Aucun ces biens », puisqu’elle suppose que je suis en utilisant un membre de la classe contenant le code.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X