sort()の使い方

これもGroovy: A Dynamic OO Language for the JVMのコードを少し変更してみて動かしてみる。
じつはよくわからなかったりする。

class Fruit {name ; weight }
list = [new Fruit(name:"orange", weight:100),
        new Fruit(name:"watermelon", weight:300),
        new Fruit(name:"apple", weight:100)]

// それぞれclone()して試してみる
clone = { list.clone() }

// これはsortする前
assert clone().name ==
        ["orange", "watermelon", "apple"]

// nameで昇順。納得できる。
assert clone().sort{ |fruit| fruit.name }.name ==
        ["apple", "orange", "watermelon"]

// この結果って正しい?
// 感覚的に["apple", "orange", "watermelon"]になるかと思ってた…
assert clone().sort{ [it.name, it.weight] }.name ==
        ["watermelon", "apple", "orange"]

// クロージャをパラメータで渡すとこうなるらし。
// <=>の意味がよくわからず。
assert clone().sort{ | a, b | a.name <=> b.name }.name ==
        ["apple", "orange", "watermelon"]