Groovy   发布时间:2022-04-12  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Groovy中for循环的一个奇怪现象引出的"全局变量?"大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_801_4@初学Groovy,用for循环的时候出现了点问题,记录下来

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

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

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

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

for(int i=0, j++){
    println "$i , $j");
}

//编译错误(具体位置在 i=0 )
//unexpected token: = at line: 1, column: 10
@H_801_4@居然不支持,于是问了下谷姐,发现确实是不支持. 链接http://stackoverflow.com/questions/14535123/groovy-for-loop-with-multiple-counters

@H_801_4@

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

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

//编译错误(具体位置在 , j++)
//expecTing ')', found ',' at line: 1, column: 24
@H_801_4@

@H_801_4@好吧,不能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, 0
1, 1
2, 2
3, 3
4, 4
@H_801_4@

@H_801_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]
@H_801_4@

@H_801_4@原来如此,大概翻译过来就是(真是的更复杂点,但大概是这样的,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")
}
@H_801_4@

@H_801_4@大家可以断点试试.

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

@H_801_4@int i = j = 0 被翻译为了

@H_801_4@int i= 0 

@H_801_4@j = 0 

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

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

for(int i=j=0; i<2; i=++j){
    k = 1
    println "$i, $j"
}

println "$k"  //输出1
println "$j"  //输出2
println "$i"  //异常, i不存在
@H_801_4@

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

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

大佬总结

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

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

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。