2012-02-28 11 views
2

私はクロージャーがうまく機能していますが、クロージャーで定義した一時変数の最終値を取得したいことがあります。例:Groovy:プライベートの価値を得るには?クロージャー変数

def someClosure = {Number input-> 
    def howDoIGetThis = input + 4 
    return 2 * input 
} 

def normalWay = someClosure(2) 
assert normalWay == 4 

def myFantasy = someClosure(2).howDoIGetThis 
assert myFantasy == 6 

これはどういうことですか?

答えて

3

あなたが閉鎖の所有者または代理人で状態を保存することができます。

def howDoIGetThis 
def someClosure = {Number input -> 
    howDoIGetThis = input + 4 
    return input * 2 
} 

def normalWay = someClosure(2) 
assert normalWay == 4 

someClosure(2) 
def myFantasy = howDoIGetThis 
assert myFantasy == 6 

状態がどのオブジェクトに入るかを制御したい場合は、クロージャのデリゲートをオーバーライドできます。たとえば、次のように私の好みのためのビット側-effecty :-)

def closureState = [:] 
def someClosure = {Number input -> 
    delegate.howDoIGetThis = input + 4 
    return input * 2 
} 
someClosure.delegate = closureState 

def normalWay = someClosure(2) 
assert normalWay == 4 

someClosure(2) 
def myFantasy = closureState.howDoIGetThis 
assert myFantasy == 6 
+0

+1素敵な代替しかし;-) –

+0

スーパーグルーヴィー...副作用回答範囲内howDoIGetThis' DEF '作られただけでは何があるのだろうあなたは 'def normalWay = someClosure(2)'のときに6に設定されますか? (第2の例では) – Mikey

2

いいえ、クロージャが単一の結果を返すだけなので(somclosure(2).howDoIGetThisは機能しません)、クロージャインスタンスが実行された後でハンドルを取得する方法はありません。 。

私は考えることができる最高の、そのような閉鎖から複数の値を返すことです:

def someClosure = {Number input-> 
    def howDoIGetThis = input + 4 
    [ 2 * input, howDoIGetThis ] 
} 

def (normalWay, myFantasy) = someClosure(2) 

assert normalWay == 4 
assert myFantasy == 6 
関連する問題