不正确使用ruby';s按函数排序
我的排序功能显然不起作用,我正试图通过不正确使用ruby';s按函数排序,ruby,sorting,arrays,Ruby,Sorting,Arrays,我的排序功能显然不起作用,我正试图通过@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:0x
@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
#
4.
#
5.
#
3.
#
7.
#
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
#
1.
#
3.
#
4.
#
5.
#
7.
使用
第一行<代码>排序依据未进行适当排序-它返回已排序的数组,并且不修改原始数组。问题
sort\u by
不会改变对象,它是一种可枚举的方法,返回一个数组,其元素是对象的每个方法生成的元素。然后它根据块中给定的条件对该数组进行排序。但请注意,它不会对数组进行排序
您通常可以按照Adrian的建议执行,并将结果分配回原始变量,但原始变量是一个常量,这会给您带来问题
解决方案
因此,您需要将所有视图
设置为常数以外的值(如果您想更改它,那么它实际上不应该是常数)。也许是一个类变量
或者,在将这些值分配给所有视图之前,您需要对其进行排序
ALL_VIEWS = view_paths.map do |path|
View.new 'views/pages' , path
end.sort_by do |view|
view.permalink.length
end
或者,您可以使用sort\u by
方法以外的其他方法进行就地排序
ALL_VIEWS.sort! do |view1,view2|
view1.permalink.length <=> view2.permalink.length
end
ALL_VIEWS.sort!做|视图1,视图2 |
视图1.permalink.length视图2.permalink.length
结束
这是可行的,但同样,如果你正在做这样的事情,那么所有的视图真的应该是一个常数吗 太棒了。所有视图都应该是一个常量,因此在分配之前应该对其进行排序-您的第一个代码片段就是票证。谢谢,这是一个很好的答案+1。更好的是,使用变异版本sort\u by
,在1.9.2中提供,或者需要后端口@Marc:是的,当我回答这个问题时,我查看了该方法的文档,当它不存在时,我感到惊讶。现在我意识到我正在查看1.8文档。我找不到排序依据的文档!,有人能联系我吗?谢谢
ALL_VIEWS.sort! do |view1,view2|
view1.permalink.length <=> view2.permalink.length
end