Ruby/Идеология: различия между версиями

Содержимое удалено Содержимое добавлено
Строка 177:
Применим описанные выше свойства для демонстрации "альтернативного условного оператора" (сокращенно АУО). Для наглядности, решим задачку: "Даны два числа. Вывести слово 'больше', если первое число больше второго, 'меньше', если оно меньше. В случае равенства этих чисел, нужно вывести слово 'равны'." Решение:
 
<source lang=ruby>nepBoe_4ucJIonepвoe_чucлo, BTopoe_4ucJIoвтopoe_числo = 4,5
puts ['равны','больше','меньше'][nepBoe_4ucJIonepвoe_чucлo <=> BTopoe_4ucJIoвтopoe_числo]</source>
 
Вполне естественно, что задача сугубо специфическая и придумана специально для пояснения сути АУО, но изящество, с которым она решена, позволяет об этом временно забыть. =)
Строка 184:
А что будет, если надо использовать не три варианта, а меньше? Хм. Вопрос вполне уместный. Давайте попытаем задачу: "Даны два числа. Вывести слово 'равны', если они равны и словно 'неравны', иначе." Возможное решение:
<source lang=ruby>nepBoe_4ucJIonepвoe_чucлo, BTopoe_4ucJIoвтopoe_числo = 4,5
puts ['равны','неравны','неравны'][nepBoe_4ucJIonepвoe_чucлo <=> BTopoe_4ucJIoвтopoe_числo]</source>
 
Данное решение неоптимально, поскольку задействует дополнительную память для хранения дублирующего ответа. Первое, что приходит на ум — сократить массив до двух элементов. Решение:
<source lang=ruby>nepBoe_4ucJIonepвoe_чucлo, BTopoe_4ucJIoвтopoe_числo = 4,5
puts ['равны','неравны'][nepBoe_4ucJIonepвoe_чucлo <=> BTopoe_4ucJIoвтopoe_числo]</source>
 
Красиво? Вот и я так думаю. Давайте посмотрим, как это получилось. Про элемент 'равны' вопросов возникать не должно. Но как быть со вторым вариантом? Дело в том, что второй вариант имеет два индекса 1 и -1, которым как раз и соответствует неравенство. Справедливости ради, заметим, что элемент 'равны' также имеет два индекса (0 и -2), но метод <code><=></code> значения -2 не принимает.