6

これには簡単な答えがあると思いますが、ウェブ検索では見つかりませんでした。

私が次のものを持っている場合(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ですか?

4

3 に答える 3

6

「外部」クラス (実際には外部クラスではない) への参照が必要です。

コードをファイルに記述していると仮定すると、とのScript.groovy2 つのクラスが生成されます。メソッドが定義されている場所がわからないため、メソッドを呼び出す方法はありません。C.classScript.classCf()

いくつかのオプションがあります:

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) static 内部クラスと static f():

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

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

  static main(args) {
    assert "f" == new C().h()
  }
}
于 2013-07-15T12:17:27.580 に答える
2

もう 1 つの方法は、使用せずにクロージャーとしてmetaClass定義して使用することです。h()

def f() {}
class C {     
   def h = { f() } 
}  
x = (new C()).h
x.delegate = this

x()
于 2013-07-15T12:11:01.257 に答える
0

メタプログラミングを使用してそれを行う1つの方法を次に示します。

def f() {  println "Hello" }

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

C.metaClass.f = { f() }

x = (new C()).h();
于 2013-07-15T10:14:39.477 に答える