从groovy方法调用顶级函数

时间:2013-07-15 09:40:03

标签: groovy

我认为这有一个简单的答案,但我的网络搜索找不到它。

如果我有以下内容(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

3 个答案:

答案 0 :(得分:6)

您需要引用“外部”类(它实际上不是外部类)。

假设您在Script.groovy文件中编写代码,它会生成两个类:C.classScript.classC无法调用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();