@Typed 注释停止 Groovy 代码编译

发布于 2024-11-27 15:15:38 字数 480 浏览 1 评论 0原文

为什么这个 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++}
         ^

Why does this Groovy code...

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

...compile, but this Groovy code...

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

...not compile with error...

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++}
         ^

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

夕色琉璃 2024-12-04 15:15:38

您可以通过 @Field 注释来解决该限制,如下所示:

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

assert mt().call() == 0
assert mt().call() == 1

You can work around the restriction via the @Field annotation, like so:

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

assert mt().call() == 0
assert mt().call() == 1
恍梦境° 2024-12-04 15:15:38

发布到 Google Code Tracker 的此问题指出:

这是设计使然。

以及有关用户组的消息的链接,其中指出:

是的,这是与标准 Groovy 的最显着差异之一。
在 Groovy++ 中,共享闭包变量始终是最终变量。

我看不出你如何以 groovypp 友好的方式重写代码,所以我猜你要么需要重构代码以另一种方式来做,要么不将其声明为 @Typed

Edit< /strong>:我想你可以将行为封装在一个类中,并将方法句柄返回给成员函数

This issue posted to the google code tracker states:

This is by design.

And links to a message on the user group, which states:

Yes, this is one of most significant differences with standard Groovy.
In Groovy++ shared closure variables are always final.

I cannot see how you could rewrite that code you have in a groovypp friendly way, so I guess you would either need to refactor the code to do it another way, or else not declare it as @Typed

Edit: I guess you could encapsulate the behaviour in a class, and return a method handle to a member function

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文