2011-06-01 64 views
1

如果我有兩個數組,a1和a2在ruby中做一個詞典比較,我做a1 < => a2。當在ruby中進行詞典對比時覆蓋二元謂詞

有沒有辦法來重寫ruby如何比較每個元素?

我想什麼做的是一樣的東西

a1.collect(&:name) <=> a2.collect(&:name) 

沒有收集,因爲這是創建兩個新的陣列(例如,如果我們正在整理一個數組的數組,大量的時間是花在分配器上)。

我可以寫我自己的字典學比較函數,但是這看起來很反ruby,我不確定它是否會更快,因爲在ruby空間花費的時間(vs C空間)。

編輯:另一個例子將是對兩個字符串數組進行不區分大小寫的比較。

回答

0

改變陣列的比較方式是很危險的,所以你應該創建一個Array的子類。假設您的a1a2屬於A,它是Array的子類。然後,重新定義<=>如下:

class A; def <=> other; collect(&:name) <=> other.collect(&:name) end end 
1

傳遞自定義塊以代替sort_by

meta_array = [a1, a2] 
meta_array.sort_by do |arr| 
    arr.collect(&:name) 
end