Я думаю, что это отличный однострочный Ruby:
someArray.sort_by {rand}
Это краткий, читаемый, и он работает, но я не совсем понимаю, как это сделать. Вот что я знаю:
-
rand
оценивает число от 0 до 1 (например, 0.783468632804653) -
rand
неоднократно оценивается в коде выше, потому что назначение егоx
сначала прерывает случайный сортировку -
sort_by {0.783468632804653}
или любое другое число, которое я пробовал, не влияет на массив
ruby-doc.org не помог мне в этом случае.
Может кто-нибудь объяснить это шаг за шагом?
Update
Я использую Ruby дольше, и я вижу, что мне не хватало концепции или двух здесь. Главное, что:
-
rand
- метод (определенный на ядре); он генерирует случайное число -
{rand}
- это блок, которыйsort_by
сохраняет, называя его каждый раз, он хочет сравнить два элемента в коллекции. Если коллекция представляет собой группу объектов, представляющих страны, она должна иметь возможность захватить два из них и определить, какой из них будет первым. Вы сначала ставите имя с самым длинным именем? Тот, у кого самая большая масса суши? Блок должен ответить на этот вопрос, вернув значение, которое говорит "вы спросили об Испании против Камеруна, и я говорю, что Камерун на первом месте". (Вы можете сделать это с помощью{|country| country.name.length}
Остальная часть работы sort_by
объясняется в документации. Я все еще не совсем уверен, почему возвращение случайного числа работает вообще - предположительно sort_by
округляет его до -1, 0 или 1, в зависимости от того, что ближе? Но в любом случае получение различного случайного числа каждый раз, когда вы вызываете блок, сильно отличается от получения того же числа каждый раз. Когда sort_by
говорит, "какая из этих двух стран на первом месте?", {rand}
ставит повязку, поворачивается примерно в 10 раз, указывает и говорит "тот!".:)