1. ホーム
  2. groovy

[解決済み] Groovy: "def x = 0" の "def" は何のためにあるのですか?

2022-04-15 07:54:02

質問

次のコードでは、(1.2.3.4.1 の Groovy Semantics マニュアルページ というキーワードを代入の前につけているのはなぜでしょうか? def ?

def x = 0
def y = 5

while ( y-- > 0 ) {
    println "" + x + " " + y
    x++
}

assert x == 5

def というキーワードを削除しても、このスニペットは同じ結果をもたらします。では 効果 というキーワードの def ?

解決方法は?

これは、基本的なスクリプトのための構文上の糖分です。 def"キーワードを省略すると、変数は現在のスクリプトのバインディングに置かれ、groovyはそれを(ほとんど)グローバルスコープ変数のように扱います。

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

その代わりに def キーワードを使用すると、変数がスクリプトバインディングに配置されません。

def y = 2

assert y == 2

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

エラーが発生しました。

大きなプログラムではdefキーワードを使うことが重要で、変数が見つかるスコープを定義し、カプセル化を維持するのに役立ちます。

スクリプト内でメソッドを定義した場合、メインスクリプトの本体で "def" で作成された変数はスコープ外なので、メソッドからはアクセスできません。

 x = 1
 def y = 2


public bar() {
    assert x == 1

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

bar()

は "エラーが発生しましたと表示します。

変数 "y" は関数内部ではスコープに入っていません。 "x" はgroovyが現在のスクリプトの変数のバインディングをチェックするので、スコープに入っています。 先ほども言ったように、これは単にクイック&ダーティなスクリプトを素早くタイプアウトするための構文上の糖分です(多くの場合、ワンライナー)。

大きなスクリプトでは、常に "def" キーワードを使用して、奇妙なスコープ問題に遭遇したり、意図しない変数に干渉しないようにするのがよい習慣です。