Ruby – язык для нерадивых программистов. Для тех, кому на PHP писать уже скучно, а на Java религия уже не позволяет. Вот для таких несчастных и изобрели синтаксическое извращение под названием Ruby.
Суть вкратце такова. Берем за основу синтаксис Pascal’я Python’а. Уже хорошее начало, верно? А потом начнем выкидывать все, что нерадивому программисту кажется лишним. В итоге, получается не код, а этакая головоломка. И некоторым доставляет пытаться расшифровать, а что же кто-то другой подразумевал.
Вот возьмем совсем наивный код, написанный вроде как по человечески. Будем считать факториал. Оставим в стороне то, что факториал можно считать вообще в одну строчку, а сделаем loop, и еще if в придачу. Просто для того, чтобы продемонстрировать масштабы пиздеца. С негативными значениями тоже сильно заморачиваться не будем.
def factorial(some_number) result = 1; if (!(some_number.to_i.to_s == some_number.to_s)) then result = nil; else for i in 1..some_number do result *= i; end end return result; end
Код быть может наивный, не слишком красивый, но понятен любому, кто учил программирование больше недели.
За одним лишь исключением. Уж больно странный if. Дело в том, что в Ruby нет встроенной функции для проверки, содержит ли переменная число. Так что самый верный способ: Сконвертировать переменную в integer, вернуть ее обратно в string, и затем проверить, а равно ли это значение string value переменной. Но это мелочи.
А теперь, время для Ruby!
Во-первых, if(!) это плохо. Есть специально слово, unless.
Во-вторых, “очевидно”, что скобки не нужны. Так же всякие then – от Лукавого.
В третих, return в конце функции тоже не нужен. Понятно же, что нужно вернуть. Правда ведь здорово?
В четвертых, for это для новичков. Мастера Ruby создают iterator на лету.
def factorial some_number result = 1 unless some_number.to_i.to_s == some_number.to_s result = nil else (1..some_number).each do |i| result *= i end end result end
Кстати, что будет, если убрать последнюю строчку? Функция вернет nil? Какой-нибудь undefined? Нет! Она достанет последнее, что у нее было в стеке. В данном случае – Range. Отличная разминка для ума.