【错误记录】Groovy 闭包使用报错 ( 闭包中不能直接使用外部对象的方法 | 需要先设置 delegate 代理 )

举报
韩曙亮 发表于 2022/01/10 23:56:55 2022/01/10
【摘要】 文章目录 一、报错信息二、解决方案 一、报错信息 在 Groovy 中的 Closure 闭包中 , 直接调用外部对象的方法 , 会报错 ; class Test...





一、报错信息



在 Groovy 中的 Closure 闭包中 , 直接调用外部对象的方法 , 会报错 ;

class Test {
    def fun() {
        println "fun"
    }
}

def closure = {
    fun()
}

closure()

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

报错信息 :

"D:\Program Files\Java\jdk1.8.0_221\bin\java.exe" "-Dtools.jar=D:\Program Files\Java\jdk1.8.0_221\lib\tools.jar" -Dgroovy.home=C:\Users\octop\.gradle\caches\modules-2\files-2.1\org.codehaus.groovy\groovy-all\2.3.11\f6b34997d04c1538ce451d3955298f46fdb4dbd4 "-javaagent:Y:\001_DevelopTools\006_IntelliJ_IDEA_Community\IntelliJ IDEA Community Edition 2019.3.1\lib\idea_rt.jar=14846:Y:\001_DevelopTools\006_IntelliJ_IDEA_Community\IntelliJ IDEA Community Edition 2019.3.1\bin" -Dfile.encoding=UTF-8 -classpath C:\Users\octop\.gradle\caches\modules-2\files-2.1\org.codehaus.groovy\groovy-all\2.3.11\f6b34997d04c1538ce451d3955298f46fdb4dbd4\groovy-all-2.3.11.jar org.codehaus.groovy.tools.GroovyStarter --main groovy.ui.GroovyMain --classpath .;Y:\002_WorkSpace\003_IDEA\Groovy_Demo\build\classes\groovy\main;C:\Users\octop\.gradle\caches\modules-2\files-2.1\org.codehaus.groovy\groovy-all\2.3.11\f6b34997d04c1538ce451d3955298f46fdb4dbd4\groovy-all-2.3.11.jar --encoding=UTF-8 Y:\002_WorkSpace\003_IDEA\Groovy_Demo\src\main\groovy\Groovy.groovy
Caught: groovy.lang.MissingMethodException: No signature of method: Groovy.fun() is applicable for argument types: () values: []
Possible solutions: run(), run(), run(java.io.File, [Ljava.lang.String;), find(), find(groovy.lang.Closure), any()
groovy.lang.MissingMethodException: No signature of method: Groovy.fun() is applicable for argument types: () values: []
Possible solutions: run(), run(), run(java.io.File, [Ljava.lang.String;), find(), find(groovy.lang.Closure), any()
	at Groovy$_run_closure1.doCall(Groovy.groovy:10)
	at Groovy$_run_closure1.doCall(Groovy.groovy)
	at Groovy.run(Groovy.groovy:14)

Process finished with exit code 1

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10




二、解决方案



在 Closure 闭包中 , 如果要调用外部对象的方法 , 需要先设置 Closure 闭包对象的 delegate 成员为指定的外部对象 ;

class Test {
    def fun() {
        println "fun"
    }
}

// 闭包中不能直接调用 Test 对象中的方法
// 此时可以通过改变闭包代理进行调用
def closure = {
    fun()
}

closure.delegate = new Test()
closure()

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

设置完 Closure 闭包对象的 delegate 之后 , 的执行效果 :

在这里插入图片描述

文章来源: hanshuliang.blog.csdn.net,作者:韩曙亮,版权归原作者所有,如需转载,请联系作者。

原文链接:hanshuliang.blog.csdn.net/article/details/122266647

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。