2

職場では、単純な (またはそれほど単純ではない) 質問について話し合っています。¿次の呼び出し方法に違いはありますか?

class Obj {
    def num
    def prtn = {
        print this.num
    }
}  
def listObj = [new Obj(num:1), new Obj(num:2), new Obj(num:3), new Obj(num:4)]  
// End Common code  

// Method #1  
def lst = listObj.collect{ obj-> obj.prtn() }  

// Method #2  
def lst = listObj.collect{ obj-> { -> obj.prtn()} }.each{ it() }  
// Common code  
4

2 に答える 2

2

両方のステートメントの副作用は同じです。"1234" が出力されます。しかし、戻り値は異なります。

このprtnメソッドは常に を返すnullため、 の値はlistObj.collect{ obj-> obj.prtn() }です[null, null, null, null]

の場合listObj.collect{ obj-> { -> obj.prtn()} }.each{ it() }、 aseachは呼び出されたコレクションを返し、結果は Closure オブジェクトのリストになります (それがlistObj.collect{ obj-> { -> obj.prtn()} }返されるため)。

一般に、何らかの副作用のためにコレクションを反復したい場合は、each;を使用します。別のコレクションに変換する場合は、 を使用しますcollect。そして、副作用の反復と変換の両方を混在させないようにしてください:)

于 2012-10-02T17:45:59.223 に答える
0

次のこともできます。

listObj*.prtn()

これにより、方法#1と同じ結果が得られます

于 2012-10-02T16:28:34.413 に答える