3

Groovyに次のようなコードを置き換える方法はありますか?

Task a = new Task('a')
Process p = new Process('p')

次のような簡単なもので:

task a
process p

ここでtask、およびprocessは、オブジェクトを作成して返すか、スクリプトMapに追加するメソッド呼び出しにすることができます。

私が現在抱えている主な問題aは、定義されていないために使用できないことです。

4

2 に答える 2

5

オブジェクトを作成し、変数に割り当てずに名前を付けるには、バインディングを使用できます。クロージャのバインディングへの参照を作成して保持し、ユーティリティメソッドtaskを使用processして、新しいインスタンスを名前に関連付けます。例えば:

def scriptBinding = new Binding()

def task = { String name ->
    scriptBinding[name] = new Task(name)
}
def process = { String name ->
    scriptBinding[name] = new Process(name)
}

def script = {
    task 'a'
    process 'b'

    println a
    println b
}
script.binding = scriptBinding
script()

a引用符で囲む必要がbあるため、未定義の変数ではなく文字列として解釈されることに注意してください。引用符を省略したい場合は、次のように、未定義の記号を文字列表現として評価するカスタムBindingオブジェクトを使用できます。

class SymbolAsStringBinding extends Binding {
    Object getVariable(String name) {
        try {
            super.getVariable(name)
        } catch (MissingPropertyException e) {
            name
        }
    }

    boolean hasVariable(String name) {
        true
    }
}

この追加により、スクリプトを次のように記述できます。

def script = {
    task a
    process b

    println a
    println b
}
于 2012-09-19T20:13:59.020 に答える
1

これを試して:

class Task {
    String name
    Task(name) { this.name = name }
    String toString() { "task: $name".toString() }
}

def propertyMissing(String name) { this.getBinding()[name] = name }

def task(name) { this.getBinding()[name]  = new Task(name) }

task a
println a

これにより、次のものが生成されます。

 task: a

基本的にあなたが到達したとき

task a

ステートメントは、その名前のコンテンツで名前がpropertyMissing()付けられた変数をバインディングに入れます。a後でtask()関数はa、バインディング内の変数を、欠落している変数の名前を名前として渡す新しいタスクに置き換えます。a

于 2012-09-30T08:55:02.013 に答える