gpt4 book ai didi

groovy invokeMethod 将方法添加到元类需要 if 语句吗?

转载 作者:行者123 更新时间:2023-12-02 08:15:29 26 4
gpt4 key购买 nike

我注意到 Groovy MetaClass 的一些奇怪行为,我想知道是否有人可以给我一些关于这里发生的事情的线索。

这工作正常:

@Override
Object invokeMethod(String name, Object args) {
if(true) {
println("Should only see this once")
def impl = { Object theArgs -> println("Firing WeirdAction") }
getMetaClass()."$name" = impl
return impl(args)
}
}

但是,如果我去掉 if 语句,它会抛出 MissingPropertyException:

@Override
Object invokeMethod(String name, Object args) {
println("Should only see this once")
def impl = { Object theArgs -> println("Firing WeirdAction") }
getMetaClass()."$name" = impl
return impl(args)
}

这是我的类实例化和调用,除了上面的方法定义之外,该类是空的。

IfTester sut = new IfTester()
sut.WeirdAction()

有人知道我在这里误解了什么吗?

最佳答案

使用 Groovy 2.4.5,问题似乎与 getMetaClass()IfTester.getMetaClass() 有关。考虑:

class IfTester {

@Override
Object invokeMethod(String name, Object args) {
if (true) {
println "Should only see this once"
def impl = { def theArgs -> println "Firing WeirdAction" }
def mc1 = getMetaClass()
println "mc1: " + mc1
println "----"
def mc2 = IfTester.getMetaClass()
println "mc2: " + mc2
IfTester.getMetaClass()."$name" = impl
return impl(args)
}
}
}

IfTester sut = new IfTester()
sut.WeirdAction()

使用 if(true),则 mc1mc2 是相同的,并且都可以工作。如果没有 ifmc1 会有所不同,使用该样式会导致错误。

我不知道根本原因,也不知道它是否是一个错误。不知何故,似乎存在范围界定问题,或者 this 在该上下文中的含义有所不同。

关于groovy invokeMethod 将方法添加到元类需要 if 语句吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39153659/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com