Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何更改Groovy脚本的默认闭包解析策略?

如何更改Groovy脚本的默认闭包解析策略?
EN

Stack Overflow用户
提问于 2013-06-24 09:10:21
回答 1查看 932关注 0票数 0

我正在编写一个包含大量全局属性和闭包的大型Groovy脚本。所有的闭包都被用来向现有的类添加新方法,例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
myProperty = 'foo'
// ...more script code...

class MyClass {
    def myProperty = 'default'
}
// ...more script code...

MyClass.metaClass.evaluate = { ->
    myProperty = 'bar'
}

def mc = new MyClass()
mc.evaluate()
println mc.myProperty // prints out "default" instead of "bar"

我的目的是让闭包的myProperty引用委托类的myProperty,而不是全局的。我找到了几种处理这个问题的方法:

1)在闭包中显式取消引用delegate

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MyClass.metaClass.evaluate = { ->
    delegate.myProperty = 'bar'
}

def mc = new MyClass()
mc.evaluate()
println mc.myProperty // prints out "bar" as desired

2)将闭包的解决策略设置为DELEGATE_ONLY:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def evalClosure = { ->
    myProperty = 'bar'
}
evalClosure.resolveStrategy = Closure.DELEGATE_ONLY
MyClass.metaClass.evaluate = evalClosure

def mc = new MyClass()
mc.evaluate()
println mc.myProperty // prints out "bar" as desired

我更愿意使用方法2来避免“委托”在我的闭包中的所有位置,但我不喜欢为我创建的每个闭包设置解决策略。

如何告诉Groovy默认情况下对所有闭包使用DELEGATE_ONLY解析策略?这可能吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-24 23:48:25

据我所知,无法更改默认的委托策略,据我所见,您有两个选项:

  1. 将脚本拆分为类(因此,脚本级别的myProperty和类级别的myProperty不在同一范围内)
  2. 编写一个方法来更改resolveStrategy,并在设置metaClass时调用它,即: 只def (闭包c){ c.resolveStrategy = Closure.DELEGATE_ONLY c} MyClass.metaClass.evaluate =只{ -> myProperty = 'bar‘}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17281119

复制
相关文章
【Groovy】闭包 Closure ( 闭包调用 | 闭包默认参数 it | 代码示例 )
在 closure() 调用时 , 传入一个参数 , 会自动赋值给闭包中的 it 变量 ;
韩曙亮
2023/03/30
7120
【Groovy】闭包 Closure ( 闭包调用 | 闭包默认参数 it | 代码示例 )
Groovy 闭包
本文介绍了Groovy闭包的有关内容。闭包可以说是Groovy中最重要的功能了。如果没有闭包,那么Groovy除了语法比Java简单点之外,没有任何优势。但是闭包,让Groovy这门语言具有了强大的功能。如果你希望构建自己的领域描述语言(DSL),Groovy是一个很好的选择。Gradle就是一个非常成功的例子。
乐百川
2022/05/05
7750
【Groovy】闭包 Closure ( 闭包中调用 Groovy 脚本中的方法 | owner 与 delegate 区别 | 闭包中调用对象中的方法 )
在 Groovy 脚本中 , 在 Closure 闭包中 , 可以直接调用 Groovy 脚本中定义的方法 ;
韩曙亮
2023/03/30
3.1K0
Groovy中的闭包
今天分享一下Groovy的闭包。基本上,我们可以将闭包视为代码,语句块,它们可以访问周围范围的所有变量或方法,并且可以将这些代码块分配给变量,并将它们传递到其他地方。
FunTester
2020/05/04
1.6K0
Groovy-10.闭包
闭包是一个短的匿名代码块,它表示一个函数,读取其他函数内部变量。 Groovy 用大括号定义闭包 class Example { static void main(String[] args) { def clos = {println "Hello World"}; clos.call(); } } 闭包中的形参 闭包可以在定义闭包时引用变量,可以接受变量和参数: class Example { static void main(String[] ar
悠扬前奏
2019/06/02
3990
【Groovy】闭包 Closure ( 自定义闭包参数 | 自定义单个闭包参数 | 自定义多个闭包参数 | 闭包参数默认值指定 )
为闭包指定参数列表 , 需要在闭包 开始位置使用 " -> " 符号 , 在该符号的左侧指定参数列表 ;
韩曙亮
2023/03/30
2.5K0
【Groovy】闭包 Closure ( 自定义闭包参数 | 自定义单个闭包参数 | 自定义多个闭包参数 | 闭包参数默认值指定 )
【Groovy】闭包 Closure ( 闭包作为函数参数 | 代码示例 )
文章目录 一、闭包作为函数参数 二、闭包作为函数参数代码示例 一、闭包作为函数参数 声明一个 fun 函数 , 可以 将参数声明为 Closure<?> 闭包类型 , 在该函数中 , 执行闭包内容 ;
韩曙亮
2023/03/30
5450
【Groovy】闭包 Closure ( 闭包作为函数参数 | 代码示例 )
【Groovy】闭包 Closure ( 闭包类 Closure 简介 | this、owner、delegate 成员区别 | 静态闭包变量 | 闭包中定义闭包 )
在闭包中 , 打印 this , owner , delegate , 打印结果都是创建闭包时所在的类 ;
韩曙亮
2023/03/30
7930
【Groovy】闭包 Closure ( 闭包类 Closure 简介 | this、owner、delegate 成员区别 | 静态闭包变量 | 闭包中定义闭包 )
【Groovy】闭包 Closure ( 闭包定义 | 闭包类型 | 查看编译后的字节码文件中的闭包类型变量 )
闭包 Closure 是 Groovy 中最常用的特性 , 使用闭包作为参数是 Groovy 语言的明显特征 ;
韩曙亮
2023/03/30
2.4K0
【Groovy】闭包 Closure ( 闭包定义 | 闭包类型 | 查看编译后的字节码文件中的闭包类型变量 )
【Groovy】闭包 Closure ( 闭包类 Closure 简介 | 闭包 parameterTypes 和 maximumNumberOfParameters 成员用法 )
闭包是 Closure 对象 , Closure 类中有很多成员 , 以及封装的函数 , 下面是 Closure 类的继承结构 ;
韩曙亮
2023/03/30
1K0
【Groovy】闭包 Closure ( 闭包类 Closure 简介 | 闭包 parameterTypes 和 maximumNumberOfParameters 成员用法 )
Groovy 基本类型与闭包
在根工程下自定义config.gradle可以直接在根project引用apply from:'config.gradle' 如果需要在app project中引用,需要加rootProject,表明当前gradle路径在根工程下,apply from: this.rootProject.file('releaseinfo.gradle')
Yif
2019/12/26
6200
混合Java函数和Groovy闭包
之前分享过Groovy中的闭包,在我日常的工作中,就会想到一个问题:“如何在Groovy中使用Java方法?”
FunTester
2020/05/01
1K0
【Groovy】闭包 Closure ( 闭包的 delegate 代理策略 | OWNER_FIRST | DELEGATE_FIRST | OWNER_ONLY | DELEGATE_ONLY )
分别在 Groovy 脚本 和 Test 类中定义 fun 方法 , 打印不同的内容 ;
韩曙亮
2023/03/30
5990
【Groovy】闭包 Closure ( 闭包的 delegate 代理策略 | OWNER_FIRST | DELEGATE_FIRST | OWNER_ONLY | DELEGATE_ONLY )
【Groovy】闭包 Closure ( 闭包参数列表规则 | 默认参数列表 | 不接收参数 | 接收自定义参数 )
如果只使用了 " -> " 符号 , 没有定义参数列表 , 仍然向闭包中传入参数的话 , 在运行时会报错 , 参考 【错误记录】Groovy 运行报错 ( Exception in thread “main“ groovy.lang.MissingMethodException: No signature of ) 博客 ;
韩曙亮
2023/03/30
8200
【Groovy】闭包 Closure ( 闭包参数列表规则 | 默认参数列表 | 不接收参数 | 接收自定义参数 )
【Groovy】闭包 Closure ( 闭包参数绑定 | curry 函数 | rcurry 函数 | ncurry 函数 | 代码示例 )
闭包 Closure 提供了 curry , ncurry , rcurry 方法 , 这
韩曙亮
2023/03/30
1K0
【Groovy】闭包 Closure ( 闭包参数绑定 | curry 函数 | rcurry 函数 | ncurry 函数 | 代码示例 )
【Groovy】闭包 Closure ( 闭包类 Closure 简介 | this、owner、delegate 成员赋值及源码分析 )
在闭包中 , 打印 this , owner , delegate , 打印结果都是闭包所在的类 ;
韩曙亮
2023/03/30
7310
【Groovy】闭包 Closure ( 闭包类 Closure 简介 | this、owner、delegate 成员赋值及源码分析 )
27. Groovy 闭包知识-第二篇 委托和授权学习
这一篇开始学习闭包的授权策略等知识点。例如和lambda的区别,闭包的委托delegate,所有owner等作用。
zinyan.com
2023/02/23
4560
27. Groovy 闭包知识-第二篇 委托和授权学习
[Android Gradle] 搞定Groovy闭包这一篇就够了
做Android开发的同学,对Gradle肯定不陌生,我们用它配置、构建工程,可能还会开发插件来促进我们的开发,我们必须了解Gradle,而不仅限于只会当配置构建工具,我想学习它,于是就有了这一系列的文章。
Android技术干货分享
2019/03/27
1.3K0
[Android Gradle] 搞定Groovy闭包这一篇就够了
【Groovy】Groovy 脚本调用 ( Linux 中调用 Groovy 脚本 | Windows 中调用 Groovy 脚本 )
在 命令行 , Groovy 脚本 , Groovy 类 , Java 类中 , 可以调用 Groovy 脚本 ;
韩曙亮
2023/03/30
2K0
【Groovy】Groovy 脚本调用 ( Groovy 脚本编译 | Groovy 脚本字节码文件分析 )
Groovy 脚本编译后生成的是 groovy.lang.Script 类 ; 该类继承自 GroovyObjectSupport 类 ;
韩曙亮
2023/03/30
2K0

相似问题

Groovy中闭包参数的默认值

28

Groovy全局存储来自不同脚本的闭包

15

理解groovy闭包

11

Groovy闭包概念

16

groovy闭包参数

24
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文