Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不正确使用ruby';s按函数排序_Ruby_Sorting_Arrays - Fatal编程技术网

不正确使用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