AIeosha (aleosha) wrote,
AIeosha
aleosha

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

Tags: *.bak
Subscribe

  • Пройдено с апреля

    PC: Hitman 2 Modern Warfare Remastered Settlers 7 3DS: Devil Survivor 2 Fire Emblem Awakening Switch: Legend of Zelda: Breath…

  • Hitman 2

    We all have barcodes on the back of our heads. Most people just never notice. Прошел Hitman 2. Последний эпизод – средневековый замок,…

  • Hitman 2

    Hitman бесконечно retcon’ят. Изначально, в первой трилогии, Hitman’ы были именно что клонами, и появлялись уже взрослыми. Нынешняя…

  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 2 comments