2010-11-01 49 views
1

如代碼:在Ruby中,有沒有辦法使用| i,j |來替代「arr.sort {| i | Math.cos(i)* Math.sin(i)}」。並重復兩次?

irb(main):001:0> a = [1, 2, 3, 4, 5] 
=> [1, 2, 3, 4, 5] 

irb(main):002:0> a.sort {|d,e| (d - 3).abs <=> (e - 3).abs} 
=> [3, 2, 4, 1, 5] # sort by closest distance away from the number 3 

它也不是那麼好重複兩次表達,實在是太微不足道創建一個函數只是該表達式。有沒有還寫類似

irb(main):002:0> a.sort {|e| (e - 3).abs} # compare by this expression 

回答

8

的方式,您正在尋找的sort_by方法:

a.sort_by {|e| (e - 3).abs} 
+0

工作,即使在1.8.6! – 2010-11-01 11:54:37

+0

順便說一句,文檔說它比較慢:http://ruby-doc.org/core/classes/Enumerable.html#M003120「sort_by的當前實現生成一個包含原始集合元素和映射的元組數組值,這使得sort_by在鍵集很簡單時相當昂貴「我在Ruby 1.8.6,1.8.7和1.9.2中嘗試過,它們是相同的。我想這是新一代數據讓它變慢。 – 2010-11-01 12:07:54

+0

也許我們可以改變'sort'來自動使用Metaprogramming來做到這一點(它可以檢測到塊只需要一個參數?),或者創建另一種方法使其與'sort'一樣快? – 2010-11-01 12:10:09

相關問題