Сортирането беше загриженост за компютърните учени от самото начало. Там имаше много алгоритми които влязоха и изпаднаха от употреба и все още днес нови алгоритми прокарват границите на производителността. Като език на високо ниво, няма да прилагате алгоритми за сортиране в рубин ако ви пука за производителността и освен това сортирането Масивите и други колекции са още нещо, което Ruby прави за вас.
Технически сортирането е работа, която се обработва от модула Enumerable. Модулът Enumerable е това, което свързва всички видове колекции в Ruby заедно. Той се справя с итерация над колекции, сортиране, преглеждане и намиране на определени елементи и т.н. Колко много сортира колекция е загадка или поне трябва да остане такава. Реалният алгоритъм за сортиране е без значение, единственото, което трябва да знаете, е, че обектите в колекцията се сравняват с помощта на „оператора на космически кораб“.
"Операторът на космически кораб" взема два обекта, сравнява ги и след това връща -1, 0 или 1. Това е малко неясно, но самият оператор няма много добре дефинирано поведение. Нека вземем например числови обекти. Ако имате два цифрови обекта
а и би оценявайте a <=> b, на какво ще оцени изразът? В случая с числата е лесно да се каже. Ако a е по-голямо от b, то ще бъде -1, ако те са равни, то ще е 0, а ако b е по-голямо от a, то ще бъде 1. Това се използва, за да се каже алгоритъмът за сортиране кой от двата обекта трябва да премине първо в масив. Само не забравяйте, че ако левият операнд ще дойде първо в масива, той трябва да оцени на -1, ако дясната ръка трябва да бъде първа, тя трябва да е 1, а ако няма значение, трябва да е 0.Не винаги спазва подобни подредени правила. Какво се случва, ако използвате този оператор върху два обекта от различен тип? Вероятно ще получите изключение. Какво се случва, когато се обадите 1 <=> „маймуна“? Това ще бъде еквивалент на обаждането 1. <=> ( "Маймуна), което означава, че действителният метод се извиква на наляво операнд и Fixnum # <=> връща нула, ако десният операнд не е число. Ако операторът върне нула, методът на сортиране ще доведе до изключение. Така че, преди да сортирате масиви, уверете се, че те съдържат обекти, които могат да бъдат сортирани.
Второ, действителното поведение на оператора на космическия кораб не е дефинирано. Определен е само за някои от базовите класове, а за вашите персонализирани класове зависи изцяло от вас какво искате да означават. Ако имате a Студент клас можете да имате сортиране на ученик по фамилия, име, степен или комбинация от това. Затова винаги имайте предвид, че поведението на оператора на космически кораб и сортирането не е добре дефинирано за нищо друго, освен за базовите типове.
Имате масив от числови обекти и бихте искали да ги сортирате. Има два основни метода за това: вид и вид!. Първият създава копие на масива, сортира го и го връща. Вторият сортира масива на място.
Това е доста обясняващо. Така че нека го вземем на едно ниво. Ами ако не искате да разчитате на оператора на космическия кораб? Ами ако искате съвсем различно поведение? Тези два метода за сортиране приемат незадължителен параметър за блок. Този блок приема два параметъра и трябва да даде стойности точно както прави операторът на космическия кораб: -1, 0 и 1. И така, като имаме предвид масива, искаме да го сортираме, така че всички стойности, които са делими на 3, идват на първо място, а всички останали идват след това. Реалният ред тук няма значение, само че онези, които се делят на 3, идват на първо място.
Как работи това? Първо, обърнете внимание на блоковия аргумент към метода за сортиране. Второ, обърнете внимание на модулните раздели, направени на блоковите параметри, и повторната употреба на оператора на космическия кораб. Ако единият е кратно на 3, модулът ще бъде 0, в противен случай ще бъде 1 или 2. Тъй като 0 ще се сортира преди 1 или 2, тук има значение само модулът. Използването на блоков параметър е особено полезно в масиви, които имат повече от един тип елемент, или когато искате да сортирате по персонализирани класове, които нямат определен оператор на космически кораб.
Има още един метод за сортиране, наречен sort_by. Въпреки това, първо трябва да разберете превеждането на масиви и колекции с карта, преди да се справите с sort_by.