Categories
*.BAK

О Ruby

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. Отличная разминка для ума.