2010-11-01 48 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

相关问题