我的排序功能显然不起作用,我试图按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
答案 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!