从groovy方法调用顶级函数

Cli*_*ton 5 groovy

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

如果我有以下(ideone):

def f() {}

class C
{
    public h() { f() }
}

x = (new C()).h();
Run Code Online (Sandbox Code Playgroud)

此操作失败,并显示以下错误:

No signature of method: c.f() is applicable for argument types: () values: []
Run Code Online (Sandbox Code Playgroud)

我如何f()从一个方法内部调用C

Wil*_*ill 6

您需要引用"外部"类(它实际上不是外部类).

假设您在一个Script.groovy文件中编写代码,它会生成两个类:C.classScript.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()
Run Code Online (Sandbox Code Playgroud)

3)使C内部类(其也需要的一个实例Script:

class Script {
  def f() { "f" }

  class C
  {
      public h() { f() }
  }

  static main(args) {
    assert "f" == new C(new Script()).h()
  }
}
Run Code Online (Sandbox Code Playgroud)

4)静态内部类加静态f():

class Script {
  static def f() { "f" }

  static class C
  {
      public h() { f() }
  }

  static main(args) {
    assert "f" == new C().h()
  }
}
Run Code Online (Sandbox Code Playgroud)