1

なぜこのGroovyコードは...

def mt(){
  def i= 0
  def c= {i++}
}

...コンパイルしますが、このGroovyコード...

@Typed def mt(){
  def i= 0
  def c= {i++}
}

...エラーでコンパイルされません...

org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:  
C:\Users\gavin\Documents\Personal\Groovy\otherRun.groovy: 5: 
Cannot modify final field otherRun$mt$1.i @ line 5, column 11.  
 def c= {i++}
         ^
4

2 に答える 2

3

次のように、@Fieldアノテーションを介して制限を回避できます。

@Typed def mt(){
    @Field def i = 0
    def c = {i++}
}

assert mt().call() == 0
assert mt().call() == 1
于 2011-08-02T19:22:05.230 に答える
1

グーグルコードトラッカーに投稿されたこの問題は次のように述べています。

これは仕様によるものです。

そして、ユーザーグループのメッセージへのリンク。

はい、これは標準のGroovyとの最も重要な違いの1つです。Groovy ++では、共有クロージャ変数は常に最終です。

groovyppに適した方法でコードを書き直す方法がわからないため、別の方法でコードをリファクタリングするか、@Typedとして宣言しない必要があると思います。

編集:動作をクラスにカプセル化し、メソッドハンドルをメンバー関数に返すことができると思います

于 2011-08-02T13:39:38.540 に答える