不正确使用ruby的sort_by函数

时间:2010-07-03 19:02:58

标签: ruby sorting arrays

我的排序功能显然不起作用,我试图按ALL_VIEWS排序@permalink.length

ALL_VIEWS.sort_by {|view| view.permalink.length}

ALL_VIEWS[0..4].each do |view|
    puts view.inspect
    puts view.permalink.length
end

这会产生:

#<View:0x1014da7b8 @permalink="xxxx">
4
#<View:0x1014da790 @permalink="yyyyy">
5
#<View:0x1014da718 @permalink="zzz">
3
#<View:0x1014da6a0 @permalink="aaaaaaa">
7
#<View:0x1014da628 @permalink="b">
1

我期待以下结果:

#<View:0x1014da628 @permalink="b">
1
#<View:0x1014da718 @permalink="zzz">
3
#<View:0x1014da7b8 @permalink="xxxx">
4
#<View:0x1014da790 @permalink="yyyyy">
5
#<View:0x1014da6a0 @permalink="aaaaaaa">
7

2 个答案:

答案 0 :(得分:6)

使用

ALL_VIEWS.replace ALL_VIEWS.sort_by {|view| view.permalink.length }

为第一行。 sort_by没有排序 - 它返回已排序的数组,不会修改原始数组。

答案 1 :(得分:3)

问题

sort_by不会改变对象,它是Enumerable的一种方法,它返回一个Array,其元素是由对象的each方法产生的元素。然后它按照块中给出的条件对该数组进行排序。但请注意,它不会对您的数组进行排序 docs for Enumerable#sort_by

您通常可以执行Adrian建议的操作,并将结果分配回原始变量,但您的原始变量是常量,这会给您带来问题。

解决方案

所以你需要使ALL_VIEWS不是常数(如果你想改变它,那么它确实不应该是常数)。也许是一个类变量?


或者您需要在将这些值分配到ALL_VIEWS

之前对其进行排序
ALL_VIEWS = view_paths.map do |path| 
  View.new 'views/pages' , path 
end.sort_by do |view| 
  view.permalink.length
end

或者您可以使用sort_by方法

之外的其他内容进行排序
ALL_VIEWS.sort! do |view1,view2| 
  view1.permalink.length <=> view2.permalink.length
end

这会有效,但是如果你正在做这样的事情,那么ALL_VIEWS真的应该是一个常数吗? docs for Array#sort and Array#sort!