неправильное использование функции sort_by в ruby - PullRequest
0 голосов
/ 03 июля 2010

Моя функция сортировки явно не работает, я пытаюсь отсортировать 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 ]

6 голосов
/ 03 июля 2010

Используйте

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

для первой строки. sort_by не сортирует на месте - возвращает отсортированный массив и не изменяет исходный.

3 голосов
/ 03 июля 2010

Проблема

sort_by не изменяет объект, это метод Enumerable, который возвращает массив, элементы которого являются элементами, полученными методом each вашего объекта.Затем он сортирует этот массив по критериям, указанным в вашем блоке.Но обратите внимание, что он не сортирует ваш массив документов для Enumerable # sort_by

Обычно вы можете делать то, что предложил Адриан, и присваивать результаты обратно исходной переменной,но ваш оригинал - это константа, которая может вызвать проблемы.

Решение (я)

Так что вам нужно либо сделать 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 действительно должна быть константой? документы для Array # sort и Array # sort!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...