Groovy中for循环的一个奇怪现象引出的"全局变量?"

Groovy中for循环的一个奇怪现象引出的"全局变量?",第1张

概述初学Groovy, 用for循环的时候出现了点问题,记录下来 环境: Eclipse4.4, Groovy编译器版本 2.3.7 Java版本:1.8_23_x86 看下面在Java中比较常见的代码 for(int i=0, j=0; i<5; i++, j++){    System.out.println(i + ", " + j);} 于是我想当然的在Groovy中照着写了一个, for

初学Groovy,用for循环的时候出现了点问题,记录下来

环境: Eclipse4.4,Groovy编译器版本 2.3.7 Java版本:1.8_23_x86

看下面在Java中比较常见的代码

for(int i=0, j=0; i<5; i++, j++){    System.out.println(i + ", " + j);}


于是我想当然的在Groovy中照着写了一个,

for(int i=0, j++){    println "$i , $j");}//编译错误(具体位置在 i=0 )//unexpected token: = at line: 1, column: 10

居然不支持,于是问了下谷姐,发现确实是不支持. 链接: http://stackoverflow.com/questions/14535123/groovy-for-loop-with-multiple-counters


机智如我,有怎么会被区区编译错误拦住,换个方式

for(int i=j=0; i<5; i++, j++){    println "$i, $j"}//编译错误(具体位置在 , j++)//expecting ')', found ',' at line: 1, column: 24


好吧,不能j++就算了,我放循环里面去,终于可以执行了

for(int i=j=0; i<5; i++){    println "$i, $j"    j++}//再减少一行for(int i=j=0; i<5; i=++j){    println "$i, $j"}//输出0, 01, 12, 23, 34, 4


好了,不报错了,舒服了...那么问题来了,为什么这么可以~~~~~于是抄起字节码开看,关键位置

     28  goto 169     31  iconst_0     32  istore_2     33  iload_2     34  invokestatic java.lang.Integer.valueOf(int) : java.lang.Integer [67]     37  ldc <Class main.Temp> [2]     39  aload_0 [this]     40  ldc <String "j"> [69]     42  invokestatic org.codehaus.groovy.runtime.ScriptBytecodeAdapter.setGroovyObjectProperty(java.lang.Object, java.lang.class, groovy.lang.GroovyObject, java.lang.String) : voID [73]     45  iload_2     46  istore_3 [i]     47  iload_3 [i]


原来如此,大概翻译过来就是(真是的更复杂点,但大概是这样的,i++这样的代码似乎变成了方法调用)

ScriptBytecodeAdapter.setGroovyObjectProperty(0, 当前类class, 当前类实例, "j");for(int i = 0; i<5;){    println xxxxx    ScriptBytecodeAdapter.setGroovyObjectProperty(PogoGetPropertySite.getProperty("j") + 1, "j");    i = PogoGetPropertySite.getProperty("j")}


大家可以断点试试.

那么为什么会出现这个情况了,猜测: 可能是类似于Js全局变量的概念

int i = j = 0 被翻译为了

int i= 0 

j = 0 

而全局变量底层实现是放在一个linkedHashMap中的.

由于是脚本,估计j被当作全局变量类似的东西,来证明下猜想

for(int i=j=0; i<2; i=++j){    k = 1    println "$i, $j"}println "$k"  //输出1println "$j"  //输出2println "$i"  //异常, i不存在


可以看到,i的范围在for内,而j在for外也能访问,有点类似于全局变量.

最后说明下,上面的代码放在main方法里面是会报错的~~~只能实例方法中,main是静态方法.

总结

以上是内存溢出为你收集整理的Groovy中for循环的一个奇怪现象引出的"全局变量?"全部内容,希望文章能够帮你解决Groovy中for循环的一个奇怪现象引出的"全局变量?"所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1264350.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存