1

関数間で渡されるときにGroovyがスコープと変数を管理する方法を理解するのに役立ちます。メインメソッドで宣言def fooし、それをプライベートvoidメソッドchangeStuffの引数として渡すとします。次に、次のように変更を加えることができます。

public static void main(args) {
  def foo = [:];
  changeStuff(foo);
  println(foo);
}
private static void changeStuff(foo) {
  foo.bar = "new stuff";
}

印刷された結果は次のとおりです[bar:new stuff]。しかし、他の方法でfooを操作するのに苦労しています。次の2つの例を参照してください。

public static void main(args) {
  def foo = [:];
  changeStuff(foo);
  println(foo);
}
private static void changeStuff(foo) {
  def newStuff = [:]
  newStuff.extra = "extra stuff";
  foo = newStuff;
}

プリント:[:]

public static void main(args) {
  def foo = "before";
  changeStuff(foo);
  println(foo);
}
private static void changeStuff(foo) {
  foo = "after";
}

プリントbefore

私はここに私が完全に理解していないいくつかの概念があることを知っています、多分関連していdefますか?私がこれについてもっと学ぶことができる場所に関する要約や方向性はありがたいです。

4

1 に答える 1

1

groovyでの私の経験は非常に限られているので、少しずれているかもしれません。

最初に言及したケースでは、へのfoo参照を渡しchangeStuff、メソッド内でマップを直接変更するため、mainメソッドから変更が表示されます。

foo2番目のケースでは、メソッド内のパラメーターchangeStuffが別のマップに割り当てられています。fooただし、メソッド内の変数は、main作成した最初のマップを指しているため、印刷すると空のマップになります。

3番目のケースは2番目のケースと同じです。Stringさらに、 Java(およびおそらくGroovy)のオブジェクトは不変であることに注意する必要があります。したがって、を「変更」するときString、実際に行っているのは、毎回新しいインスタンスを作成することです。

于 2013-01-17T20:17:08.893 に答える