class a {
def v1 = "v1 in a"
static def v2 = "v2 in a"
def v4 = "v4 in a"
def v5 = "v5 in a"
def va = "va in a"
def b() {
def v1 = "v1 in a.b()"
def v2 = "v2 in a.b()"
def v4 = "v4 in a.b()"
def g = {
def v0 = "v0 in closure g"
def h = {
//function b里面已经定义v4 = "v4 in a.b()"所以下面这行
//报错:The current scope already contains a variable of the name v4
//def v4 = "v4 in closure h"
}
}
def c = {
//下面的这行代码报错:The current scope already contains a variable of the name v1
//def v1 = "v1 in closure c"
println v1
println owner
println this
//下面这行定义v5变量正常,输出的结果也是:v5 in closure c
def v5 = "v5 in closure c"
println v5//v4
println va
}
println "***" + c.toString() + "***"
c() return "b func"
} def d = {
println v1;
println v2;
println v4;
def v5 = "v5 in closure d"
println v5
} def e = {
def v1 = "v1 in closure e"
def f = {
//下面这行代码报错:The current scope already contains a variable of the name v1
//def v1 = "v1 in closure f"
println v1 //下面这行就没错,因为闭包e的v2是在后面定义的
def v2 = "v2 in closure f" //下面这行报错,v3在f里面不可见
//println v3 def vf = "vf in closure f"
}
f()
def v2 = "v2 in closure e"
def v3 = "v3 in closure e" //在闭包e里面vf不可见
//println vf
}
}
def test(x) {
println "func test start --- x:" + x
def v1 = 1000
def v2 = 2000
def v3 = 3000 x()
println "func test--- end:"
}
test(new a().d)
println "--------------"
//println new a().v4
println new a().b()
new a().e() /*
通过上面的测试代码可以看出:
1.在闭包a里面定义的闭包b,那么b中定义的变量不能和和闭包a里面定义的变量名字相同.
2.在函数a里面定义的闭包b,那么b中定义的变量不能和和函数a里面定义的变量名字相同.
3.由此也可以推导出:在函数a里面定义闭包b,在闭包b里面定义闭包c,那么c中定义
的变量也不能和函数a中定义的变量名字相同,对于任意多层闭包嵌套也是如此
在闭包里面的符号查找方面:
首先在闭包里面查找,如果闭包里面没有定义,则有两种情况(假设delegate策略是Closure.OWNER_FIRST,其它策略是一样的):
1.如果这个闭包的外层是函数,则现在函数里面查找,如果函数里面也没有定义,则进入delegate策略即在owner里面查找,
如果owner里面没有,则在delegate里面查找,ruguo delegate里面没有就报错
2.如果这个闭包没外层不是函数,则直接进入delegate策略即在owner里面查找,如果owner里面没有,则在delegate里面查找
如果delegate里面没有就报错. */

Groovy里面闭包中变量符号的查找与变量定义的限制的更多相关文章

  1. python中函数嵌套、函数作为变量以及闭包的原理

    嵌套函数: python允许创建嵌套函数.也就是说我们可以在函数里面定义函数,而且现有的作用域和变量生存周期依旧不变. 例子: #encoding=utf-8 def outer():    name ...

  2. Bat 中特殊符号

    批处理.Bat 中特殊符号的实际作用,Windows 批处理中特殊符号的作用: @\\隐藏命令的回显. ~\\在for中表示使用增强的变量扩展:在set中表示使用扩展环境变量指定位置的字符串:在set ...

  3. (大数据工程师学习路径)第一步 Linux 基础入门----环境变量与文件查找

    环境变量与文件查找 本节介绍环境变量的作用与用法,及几种搜索文件的方法.学会这些技巧高效地使用 Linux. 一.环境变量 1.变量 要解释环境变量,得先明白变量是什么,准确的说应该是 Shell 变 ...

  4. $ -----JavaScript 中美元符号 $ 的作用

    JavaScript 中美元符号 $ 是什么 1.首先可以用来表示变量,比如变量 var s='asdsd'或var $s='asdasd'; 2.在正则表达式中,它可以匹配结尾:/sa$/.test ...

  5. js的闭包中关于执行环境和作用链的理解

    首先讲一讲执行环境: 执行环境按照字面上来理解就是指目前代码执行所在的环境. 当JavaScript代码执行的时候,会进入不同的执行上下文,这些执行上下文会构成了一个执行上下文栈(Execution ...

  6. 【转】【bat】Bat 中特殊符号

    批处理.Bat 中特殊符号的实际作用,Windows 批处理中特殊符号的作用: @\\隐藏命令的回显. ~\\在for中表示使用增强的变量扩展:在set中表示使用扩展环境变量指定位置的字符串:在set ...

  7. 环境变量和文件查找&文件打包与解压缩

    环境变量和文件查找 介绍环境变量的作用与用法 及几种搜索文件的方法 学会这些技巧可以高效地使用 Linux 知识点:环境变量的设置 环境变量的修改 环境变量 要解释环境变量,得先明白变量是什么,准确的 ...

  8. 在VIM中进行快速的查找和替换

    VIM是被誉为非常高效的文本编辑软件.但是掌握并高效的使用是件有难度的事情.在VIM中进行快速的查找和替换是提高VIM使用效率的重要方法.下面是我在阅读VIM用户手册时整理的一些资料: 行内搜索. f ...

  9. 关于javascript闭包中的this对象

    我们知道, this对象是运行时基于函数的执行环境绑定的:在全局函数中,this等于window,而当函数被作为某个对象的方法调用时,this等于那个对象.<Javascript高级程序设计&g ...

随机推荐

  1. 【Shell基础】循环:for、while、until

    1.for循环 ..};do echo "for loop" done 2.while循环 be_s= en_s= while [ "$be_s" -le &q ...

  2. 记一次在咸鱼上购买 MacBook Pro 的经历

    前言 以前一直用的是 windows 的,但是最近特别想买个 macOS 的.其实不是为了其他什么目的,只是涉及到开发 macOS更接近 linux 系统,一直没使用过所以就想尝试体验下,而且现在很多 ...

  3. .NET 增加扩展方法

    声明:通过一个js的实例来告诉你C#也可以实现这样的效果. 在JS中是这样实现的: 你是否见过JS中给系统默认Array对象增加一个自定义查重方法contains 在没有给Array原型上增加cont ...

  4. ABP之模块系统

    简介 ASP.NET Boilerplate提供了构建模块的基础结构,并将它们组合在一起以创建应用程序. 模块可以依赖于另一个模块. 通常,一个程序集被视为一个模块. 如果创建具有多个程序集的应用程序 ...

  5. npm包--rimraf

    含义 rimraf 包的作用:以包的形式包装rm -rf命令,用来删除文件和文件夹的,不管文件夹是否为空,都可删除. 安装 npm install rimraf --save-dev 使用 const ...

  6. 【算法】C语言趣味程序设计编程百例精解

    C语言趣味程序设计编程百例精解 C/C++语言经典.实用.趣味程序设计编程百例精解(1)  https://wenku.baidu.com/view/b9f683c08bd63186bcebbc3c. ...

  7. 【问题解决方案】AttributeError: module 'pygal' has no attribute 'Worldmap'

    <Python编程:从入门到实践>- 16章-16.2.5制作世界地图 import pygal 后报如标题的error 参考CSDN 解决:AttributeError: module ...

  8. 数据库常用的事务隔离级别和原理?&&mysql-Innodb事务隔离级别-repeatable read详解

    转载地址:https://baijiahao.baidu.com/s?id=1611918898724887602&wfr=spider&for=pc https://blog.csd ...

  9. 论Scrapy中的数据持久化

    引入 Scrapy的数据持久化,主要包括存储到数据库.文件以及内置数据存储. 那我们今天就来讲讲如何把Scrapy中的数据存储到数据库和文件当中. 终端指令存储 保证爬虫文件的parse方法中有可迭代 ...

  10. foreach 中获取索引index的方法

    一样,很少用到,记下来先 主要代码: foreach (var item in arr) { int index = arr.indexOf(item); //index 为索引值 }