[解決済み] 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" キーワードを使用して、奇妙なスコープ問題に遭遇したり、意図しない変数に干渉しないようにするのがよい習慣です。
関連
-
[解決済み] varキーワードの目的と、どのような場合に使用する(または省略する)べきですか?
-
[解決済み] キーワード「ref」と「out」の違いは何ですか?
-
[解決済み] volatileキーワードは何に役立つのでしょうか?
-
[解決済み] mutable' キーワードには、const 関数で変数を変更できるようにする以外の目的があるのでしょうか?
-
[解決済み] Groovyによるシェルコマンドの実行
-
[解決済み] Groovy: "def x = 0" の "def" は何のためにあるのですか?
-
[解決済み] Groovy / grails データ型を決定する方法は?
-
[解決済み] Gradleビルドを停止するおすすめの方法
-
[解決済み] Groovyの "each "クロージャから抜け出せるか?
-
[解決済み] Groovyのバイナリリリースとソースリリースの違い?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン