Groovy:Groovyスクリプトのメソッドからプロパティ/フィールド/ defを設定する方法は?

質問

単純なgroovyスクリプト(クラスではない!)が与えられた場合、メソッドの外にあるプロパティ/フィールドの値をどのように設定しますか?

次のコードは期待どおりに動作しません。

def hi;

def setMyVariable() {
    hi = "hello world!"
}

setMyVariable()
assert hi == "hello world!"    //fails
println hi                     //prints null

失敗した試行

私は次のものを含め、多くのことを試しました。

...

def setMyVariable() {
    this.hi = "hello world!"
}

...

public void setMyVariable() {
    hi = "hello world!"
}

...

public String hi;
public void setMyVariable() {
    this.hi = "hello world!";
}

概要

メソッド宣言の外部にある変数を設定する最も簡単な方法は何ですか?私が働くことができる唯一の事は次のとおりです。簡単な方法が必要です!

def hi;

def setMyVariable() {
    this.binding.setVariable("hi", "hello world!")
}

setMyVariable()

println this.binding.getVariable("hi")
assert this.binding.getVariable("hi") == "hello world!"  //passes
assert hi == "hello world!"  //fails
3

3 答え

メソッドを定義するのではなく、変数に無名関数を代入することができます。

def hi

def setMyVariable = {
    hi = "hello world!"
}

setMyVariable()
assert hi == 'hello world!'
4
追加された
シンプル。私はこれが好きです...私は、Groovyではしばしば、クロージャをメソッドよりも使いやすくしていることが分かりました
追加された 著者 gMale,

Groovy 1.8.xではこれを行うことができます:

@groovy.transform.Field def hi

スクリプト内の変数のスコープをスクリプトのrunメソッド内からスクリプトのクラスレベルに変更するために使用する変数注釈。

2
追加された
これは良い方法のように聞こえる。しかし、 groovy.transform.Field をインポートすると、それが見つからないというエラーが表示されます。私は Jarvana これは" groovy-all "jarファイルのようです。しかし、明らかに、そうではありません。私はgroovy 2.0を使用しています。多分それは別の瓶に入っていますか?
追加された 著者 gMale,
groovy-all-1.8.4.jarを使用するとインポートが失敗する:(
追加された 著者 gMale,
また、 groovy-1.8.4/lib にあるすべてのjarファイルをクラスパスに追加しようとしました。サイコロはありません。誰かが実際にこのスクリプトで作業しているのですか?私はこれが最高の答えだと思ったが、うまくいかない...
追加された 著者 gMale,
私はコマンドラインから実行しています(Antタスク経由で実行しています:
追加された 著者 gMale,
Strange .. groovy-1.8.0とgroovy-2.0.0-beta-1で動作します。あなたのIDEに何か問題がありますか?
追加された 著者 denis.solonenko,

Groovyのページをご覧ください:

スクリプトに変数を定義すると、変数は常にローカルになります。しかし、メソッドはそのスコープの一部ではありません。したがって、異なる変数を使用してメソッドを属性として定義し、これらの変数をスクリプト内で通常定義すると、問題が発生します。

この場合、バインディングの hi を行う必要があります(実際には def を使用しない方が簡単です)ので、自動的にバインディングの一部になります。

1
追加された