2013-07-15 2 views
5

これは簡単な答えですが、私のウェブ検索で見つけられませんでした。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: [] 

私はCのメソッド内からf()を呼び出すにはどうすればよいですか?ここで

答えて

6

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

Script.groovyファイルにコードを書き込むと仮定すると、C.classScript.classの2つのクラスが生成されます。 Cにはf()メソッドを呼び出す方法がありません。定義されている場所がわからないためです。現在のスコープ(つまり、Script

2)からメタクラスdefitionを与えるMichaelEasterのアイデア@

1)CScriptオブジェクトを渡す/作成:

あなたは、いくつかのオプションがあります。

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() 
    } 
} 
+0

プラス – Will

+0

まあ:-) @のdmahapatroの答えは説明しました。私は電話からこの説明をすることはほとんどできないので、簡単なものを提案しました。 ;) – dmahapatro

0

は、メタプログラミングを使用して、それを行うための一つの方法である:

def f() { println "Hello" } 

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

C.metaClass.f = { f() } 

x = (new C()).h(); 
2

もう一つの方法は、metaClassを使用せずに閉鎖し、使用としてh()を定義している:

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

x() 
関連する問題