Groovy里面闭包中变量符号的查找与变量定义的限制
- 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里面闭包中变量符号的查找与变量定义的限制的更多相关文章
- python中函数嵌套、函数作为变量以及闭包的原理
嵌套函数: python允许创建嵌套函数.也就是说我们可以在函数里面定义函数,而且现有的作用域和变量生存周期依旧不变. 例子: #encoding=utf-8 def outer(): name ...
- Bat 中特殊符号
批处理.Bat 中特殊符号的实际作用,Windows 批处理中特殊符号的作用: @\\隐藏命令的回显. ~\\在for中表示使用增强的变量扩展:在set中表示使用扩展环境变量指定位置的字符串:在set ...
- (大数据工程师学习路径)第一步 Linux 基础入门----环境变量与文件查找
环境变量与文件查找 本节介绍环境变量的作用与用法,及几种搜索文件的方法.学会这些技巧高效地使用 Linux. 一.环境变量 1.变量 要解释环境变量,得先明白变量是什么,准确的说应该是 Shell 变 ...
- $ -----JavaScript 中美元符号 $ 的作用
JavaScript 中美元符号 $ 是什么 1.首先可以用来表示变量,比如变量 var s='asdsd'或var $s='asdasd'; 2.在正则表达式中,它可以匹配结尾:/sa$/.test ...
- js的闭包中关于执行环境和作用链的理解
首先讲一讲执行环境: 执行环境按照字面上来理解就是指目前代码执行所在的环境. 当JavaScript代码执行的时候,会进入不同的执行上下文,这些执行上下文会构成了一个执行上下文栈(Execution ...
- 【转】【bat】Bat 中特殊符号
批处理.Bat 中特殊符号的实际作用,Windows 批处理中特殊符号的作用: @\\隐藏命令的回显. ~\\在for中表示使用增强的变量扩展:在set中表示使用扩展环境变量指定位置的字符串:在set ...
- 环境变量和文件查找&文件打包与解压缩
环境变量和文件查找 介绍环境变量的作用与用法 及几种搜索文件的方法 学会这些技巧可以高效地使用 Linux 知识点:环境变量的设置 环境变量的修改 环境变量 要解释环境变量,得先明白变量是什么,准确的 ...
- 在VIM中进行快速的查找和替换
VIM是被誉为非常高效的文本编辑软件.但是掌握并高效的使用是件有难度的事情.在VIM中进行快速的查找和替换是提高VIM使用效率的重要方法.下面是我在阅读VIM用户手册时整理的一些资料: 行内搜索. f ...
- 关于javascript闭包中的this对象
我们知道, this对象是运行时基于函数的执行环境绑定的:在全局函数中,this等于window,而当函数被作为某个对象的方法调用时,this等于那个对象.<Javascript高级程序设计&g ...
随机推荐
- 数据库【mysql篇】学习笔记
Windows服务 -- 启动MySQL net start mysql-- 创建Windows服务 sc create mysql binPath= mysqld_bin_path(注意 ...
- Django 数据库读写分离 分库分表
多个数据库 配置: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BA ...
- Luogu P5283 [十二省联考2019]异或粽子
感觉不是很难的一题,想了0.5h左右(思路歪了,不过想了一个大常数的两只\(\log\)做法233) 然后码+调了1h,除了一个SB的数组开小外基本上也没什么坑点 先讲一个先想到的方法,我们对于这种问 ...
- JAVA如何利用Swiger获取Linux系统电脑配置相关信息
最近开发java应用程序,涉及到获取Linux服务器相关配置的问题,特地网上搜寻了下,采用Swiger包可以直接获取,再次小结一下,以便于以后能方便使用,也便于其他童鞋们学习. 推荐大家参考链接:ht ...
- MVC中使用viewmodel
新建一个类在类中写 public class DataViewmodel { public List<users> usersmodel { get; set; } public List ...
- Excel阅读模式/聚光灯开发技术序列作品之三 高级自定义任务窗格开发原理简述—— 隐鹤
Excel阅读模式/聚光灯开发技术序列作品之三 高级自定义任务窗格开发原理简述—— 隐鹤 1. 引言 Excel任务窗格是一个可以用来存放各种常用命令的侧边窗口(准确的说是一个可以停靠在类名为x ...
- laravel 多条件查询
select * from homework where (id between 1 and 10 or id between 50 and 70) and complete = 1 and (tit ...
- axios拦截http拦截
一,判断登录页面 const routes = [ { path: '/', name: '/', component: Index }, { path: '/repository', name: ' ...
- Activiti6-FormService(学习笔记)重要
设置流程定义文件: <?xml version="1.0" encoding="UTF-8"?> <definitions xmlns=&qu ...
- python高级编程笔记一 正则表达式
事例