博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Groovy里面闭包中变量符号的查找与变量定义的限制
阅读量:7106 次
发布时间:2019-06-28

本文共 2711 字,大约阅读时间需要 9 分钟。

1 class a { 2     def v1 = "v1 in a" 3     static def v2 = "v2 in a" 4     def v4 = "v4 in a" 5     def v5 = "v5 in a" 6     def va = "va in a" 7     def b() { 8         def v1 = "v1 in a.b()" 9         def v2 = "v2 in a.b()"10         def v4 = "v4 in a.b()"11         def g = {12             def v0 = "v0 in closure g"13             def h = {14                 //function b里面已经定义v4 = "v4 in a.b()"所以下面这行15                 //报错:The current scope already contains a variable of the name v416                 //def v4 = "v4 in closure h"17             }18         }19         def c = {20             //下面的这行代码报错:The current scope already contains a variable of the name v121             //def v1 = "v1 in closure c"22             println v123             println owner24             println this25             //下面这行定义v5变量正常,输出的结果也是:v5 in closure c26             def v5 = "v5 in closure c"27             println  v5//v428             println va29         }30         println "***" + c.toString() + "***"31         c()32         33        return "b func"34     }35     36     def d = {37         println v1;38         println v2;39         println v4;40         def v5 = "v5 in closure d"41         println v542     }43     44     def e = {45         def v1 = "v1 in closure e"46         def f = {47             //下面这行代码报错:The current scope already contains a variable of the name v148             //def v1 = "v1 in closure f"49             println v150             51             //下面这行就没错,因为闭包e的v2是在后面定义的52             def v2 = "v2 in closure f"53     54             //下面这行报错,v3在f里面不可见55             //println v356             57             def vf = "vf in closure f"58         }59         f()60         def v2 = "v2 in closure e"61         def v3 = "v3 in closure e"62         63         //在闭包e里面vf不可见64         //println vf65     }66 }67 def test(x) {68     println "func test start --- x:" + x69     def v1 = 100070     def v2 = 200071     def v3 = 300072     73     x()74     println "func test--- end:"75 }76 test(new a().d)77 println "--------------"78 //println new a().v479 println new a().b()80 new a().e()81 82 83 /*84 通过上面的测试代码可以看出:85 1.在闭包a里面定义的闭包b,那么b中定义的变量不能和和闭包a里面定义的变量名字相同.86 2.在函数a里面定义的闭包b,那么b中定义的变量不能和和函数a里面定义的变量名字相同.87 3.由此也可以推导出:在函数a里面定义闭包b,在闭包b里面定义闭包c,那么c中定义88 的变量也不能和函数a中定义的变量名字相同,对于任意多层闭包嵌套也是如此89 在闭包里面的符号查找方面:90     首先在闭包里面查找,如果闭包里面没有定义,则有两种情况(假设delegate策略是Closure.OWNER_FIRST,其它策略是一样的):91         1.如果这个闭包的外层是函数,则现在函数里面查找,如果函数里面也没有定义,则进入delegate策略即在owner里面查找,92         如果owner里面没有,则在delegate里面查找,ruguo delegate里面没有就报错93         2.如果这个闭包没外层不是函数,则直接进入delegate策略即在owner里面查找,如果owner里面没有,则在delegate里面查找94         如果delegate里面没有就报错.95 96 */

 

转载于:https://www.cnblogs.com/xxNote/p/10654243.html

你可能感兴趣的文章
GhostBSD 19.04 发布,注重安全与稳定性的 FreeBSD 发行版
查看>>
5分钟记住列表的使用功能-Python基础前传(7)
查看>>
FreeBuf爬虫
查看>>
python实现冒泡排序算法
查看>>
Unity光照概述
查看>>
扩展jwt解决oauth2 性能瓶颈
查看>>
如何选择合适的基于ARM的MCU
查看>>
Android Gradle进阶配置指南
查看>>
Java 8 - lambda
查看>>
Installing a Dependency Library for Function Compute
查看>>
Java B2B2C多用户商城 springcloud架构 - 企业云架构common-service代码结构分析(六)...
查看>>
SpringBoot b2b2c 多用户商城系统(十五)Springboot整合RabbitMQ
查看>>
【重磅】Spring Boot 2.1.0 权威发布
查看>>
深创投旗下首只天使基金成立 总规模5亿元
查看>>
golang快速扫描
查看>>
「镁客早报」夏普分拆半导体业务;教育部要求高校组织开展基因编辑相关研究项目自查工作...
查看>>
python学习手册15 文档
查看>>
js笔记
查看>>
PostgreSQL 大版本升级方法之一 - 不落地并行导出导入
查看>>
2019大数据学习路线指南(最全知识点总结)
查看>>