我认为这有一个简单的答案,但我的网络搜索找不到它。
如果我有以下内容(ideone):
def f() {}
class C
{
public h() { f() }
}
x = (new C()).h();
此操作失败,并显示以下错误:
No signature of method: c.f() is applicable for argument types: () values: []
如何从f()
的方法中调用C
?
答案 0 :(得分:6)
您需要引用“外部”类(它实际上不是外部类)。
假设您在Script.groovy
文件中编写代码,它会生成两个类:C.class
和Script.class
。 C
无法调用f()
方法,因为它不知道它的定义位置。
你有一些选择:
1) @ MichaelEaster的想法,给出了当前范围的元类定义(即Script
)
2)在Script
内创建/传递C
个对象:
def f() { "f" }
class C
{
public h(s = new Script()) { s.f() }
}
assert "f" == new C().h()
3)让C
成为内部类(也需要Script
的实例:
class Script {
def f() { "f" }
class C
{
public h() { f() }
}
static main(args) {
assert "f" == new C(new Script()).h()
}
}
4)静态内部类加静态f()
:
class Script {
static def f() { "f" }
static class C
{
public h() { f() }
}
static main(args) {
assert "f" == new C().h()
}
}
答案 1 :(得分:2)
另一种方法,不使用metaClass
就是将h()
定义为闭包并使用:
def f() {}
class C {
def h = { f() }
}
x = (new C()).h
x.delegate = this
x()
答案 2 :(得分:0)
使用元编程,这是一种方法:
def f() { println "Hello" }
class C
{
public h() { f() }
}
C.metaClass.f = { f() }
x = (new C()).h();