このスニペットを見てください:
def line = "asdf"
String foo() {
try {
//line = "qwer"
return line
} finally {
line = "zxcv"
}
}
println line
println foo()
println line
.NETのバックグラウンドから来ると、印刷行が生成されると予想されます
asdf
asdf
zxcv
ただし、groovyでは、生成されます
asdf
zxcv
asdf
これはいくつかの点で私を困惑させます。
1) の値を印刷すると、なぜfoo()
生成されるのzxcv
ですか? line
return ステートメントが評価されて return を試行することを期待しますが、戻り値に影響を与えないasdf
set 行を返す前に。asdf
2) 2 番目の出力はであるため、行IS が実行されるzxcv
ことを受け入れる必要があります。では、なぜ3 番目の出力に対してline = "zxcv"
BACK が設定されているのでしょうか。asdf
3) 行のコメントを外すと、line = "qwer"
次のような出力が生成されます。
asdf
qwer
asdf
どちらのモデルとも矛盾していると思います。奇妙なスコーピング動作のように見えますが、ルールがここにあるのかわかりません。
Groovy 2.2.2 の使用
編集:ああ!これをgroovyコンソールから実行しています。これをクラスでラップして実行すると、プログラムは期待される出力を生成するようです。
class MyClass {
def line = "asdf"
String foo() {
try {
//line = "qwer"
return line
} finally {
line = "zxcv"
}
}
def printStuff() {
println line
println foo()
println line
}
}
new MyClass().printStuff()
生産する
asdf
asdf
zxcv
また、[スクリプト] -> [スクリプト コンテキストのクリア] メニュー オプションも発見しました。スクリプト コンテキストをクリアした直後に元のスニペットを実行すると、コンソールは次の例外をスローします。
asdf
Exception thrown
groovy.lang.MissingPropertyException: No such property: line for class: ConsoleScript53
at ConsoleScript53.foo(ConsoleScript53:6)
at ConsoleScript53.run(ConsoleScript53:13)
後続の実行で誤った出力が生成される
asdf
zxcv
asdf
この新しい情報を武器に、GroovyConsole には奇妙な点があり、そのコンテキストに持ち上げられ、上部で宣言されてline
いる代わりにそれを返しているようです。line
か何か。言語の問題ではなく、ツールの問題であることを知っていると、私が本当に楽しみ始めたばかりのこの言語から悲鳴を上げたくなくなりました。