Я хочу сортировать my_array, а затем изменить порядок.Как сортировать! массивы в рубине
Какая разметка верна?
my_array.sort.reverse!
или
my_array.sort!.reverse
Или это делает никакой разницы?
Благодаря
Я хочу сортировать my_array, а затем изменить порядок.Как сортировать! массивы в рубине
Какая разметка верна?
my_array.sort.reverse!
или
my_array.sort!.reverse
Или это делает никакой разницы?
Благодаря
Вы должны разложить цепочку:
Прежде всего, давайте понимать разницу между 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
Ваше объяснение действительно имело смысл для меня и было легко понять. Спасибо! – NateW
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 !
в рубине означает «опасный», может изменять данные или иметь другие неожиданные результаты.
Вы получите тот же результат, но один изменит исходный массив. См. Это:
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 !
после вызова метода «сохраняет» изменения в вызываемом объекте и возвращает результат.Так во втором:
reverse
на отсортированного массива, который не сохраняет ни к чему и только возвращает результат.my_array.sort!.reverse!
является правильный ответ, так как вы хотите, чтобы изменить массив у вас уже есть.
my_array.sort.reverse!
создает отсортированный копию и переворачивает его (оригинал не изменяется).
my_array.sort!.reverse
сортирует оригинал и создает перевернутую копию (оригинал не в обратном порядке).
Я думаю, что оба неверны xD Я бы написал (перед тестированием) как my_array.sort !.reverse! Это потому, что если вы не используете! по крайней мере, один из них, он вернет копию вместо изменения оригинальной IMO. Как я уже сказал, я не проверял. Вы должны, только чтобы убедиться: D – SlySherZ
@SlySherZ - Оба они на самом деле правильные, поскольку OP не уточнил, чего он хочет достичь. – BroiSatse
Зачем сортировать, а затем наоборот? Почему бы не 'my_array.sort {| x, y | y <=> x} ' –