2014-10-23 2 views
0

Я хочу сортировать my_array, а затем изменить порядок.Как сортировать! массивы в рубине

Какая разметка верна?

my_array.sort.reverse! 

или

my_array.sort!.reverse 

Или это делает никакой разницы?

Благодаря

+1

Я думаю, что оба неверны xD Я бы написал (перед тестированием) как my_array.sort !.reverse! Это потому, что если вы не используете! по крайней мере, один из них, он вернет копию вместо изменения оригинальной IMO. Как я уже сказал, я не проверял. Вы должны, только чтобы убедиться: D – SlySherZ

+2

@SlySherZ - Оба они на самом деле правильные, поскольку OP не уточнил, чего он хочет достичь. – BroiSatse

+1

Зачем сортировать, а затем наоборот? Почему бы не 'my_array.sort {| x, y | y <=> x} ' –

ответ

2

Вы должны разложить цепочку:

Прежде всего, давайте понимать разницу между sort и методом sort!. Если я пишу

array = [7,2,4] 
array.sort! 
array # => [2,4,7] 

Если вы пишете

array = [7,2,4] 
foo = array.sort 
array # => [7,2,4] 
foo # => [2,4,7] 

Метод sort сортировки массива и возвращает результат в виде выхода из функции, в то время как sort! один непосредственно изменяет существующий массив.

Так что, если вы пишете:

my_array.sort.reverse! 

Это как письма:

(my_array.sort). # => Here we create a new array who is calculated by sorting the existing one 
reverse! # => Then we reverse this new array, who is not referenced by a variable. 

Если вы пишете:

(my_array.sort!). #=> Here you sort my_array and reinject the result into my_array ! 
reverse # Then reverse it and inject the result into a NEW array 

Таким образом, в обоих случаях, вы не будете получать то, что вы хотеть ! То, что вы хотите сделать, это либо:

my_array.sort!.reverse! 

или:

new_array = my_array.sort.reverse 
+1

Ваше объяснение действительно имело смысл для меня и было легко понять. Спасибо! – NateW

0

my_array.sort!.reverse будет изменять приемник так my_array будет отсортирован после этого вызова, например

my_array = [1,4,3,5,2] 
my_array.sort!.reverse 
#=> [5,4,3,2,1] 
my_array 
#=> [1,2,3,4,5] 

вторая форма my_array.sort.reverse! не будет изменять my_array, потому что sort будет dup, тогда массив сначала reverse! изменит эту дублированную копию, которая не сохраняется. Это будет иметь тот же эффект, как my_array.sort.reverse без !

my_array = [1,4,3,5,2] 
my_array.sort.reverse! 
#=> [5,4,3,2,1] 
my_array 
#=> [1,4,3,5,2] 

В-третьих, что-то вроде my_array.sort!.reverse! изменит приемник дважды означающий my_array.sort! сортирует массив на месте, а затем .reverse! будет возмещена массив на месте. так что my_array теперь будет сортироваться и отменяться.

my_array = [1,4,3,5,2] 
my_array.sort!.reverse! 
#=> [5,4,3,2,1] 
my_array 
#=> [5,4,3,2,1] 

Хотя в данном случае я не думаю, что вам нужно будет либо грохнуть ! метод как вторая форма не имеет никакого влияния. bang ! в рубине означает «опасный», может изменять данные или иметь другие неожиданные результаты.

1

Вы получите тот же результат, но один изменит исходный массив. См. Это:

2.1.1 :001 > my_array = ["a","d","b","c"] 
=> ["a", "d", "b", "c"] 

Просто объявление массива с a, b, c и d в совершенно неправильных порядках.

2.1.1 :002 > my_array.sort.reverse! 
=> ["d", "c", "b", "a"] 

Запуск первой команды на нем возвращает обратный сортируется массив

2.1.1 :003 > my_array 
=> ["a", "d", "b", "c"] 

... но не изменяет сам исходный массив.

2.1.1 :004 > my_array.sort!.reverse 
=> ["d", "c", "b", "a"] 

Запуск второй команды возвращает тот же результат, массив отсортирован в обратном направлении

2.1.1 :005 > my_array 
=> ["a", "b", "c", "d"] 

Но сам массив был изменен, но только по sort! вызова. A ! после вызова метода «сохраняет» изменения в вызываемом объекте и возвращает результат.Так во втором:

  • Вы сортирует массив, спасительную изменения к нему и возвращающегося отсортированный массив, то
  • Run reverse на отсортированного массива, который не сохраняет ни к чему и только возвращает результат.
0
my_array.sort!.reverse! 

является правильный ответ, так как вы хотите, чтобы изменить массив у вас уже есть.

my_array.sort.reverse! 

создает отсортированный копию и переворачивает его (оригинал не изменяется).

my_array.sort!.reverse 

сортирует оригинал и создает перевернутую копию (оригинал не в обратном порядке).

Смежные вопросы