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

  • Garmin Vivoactive 4

    Для smart alarm’а худо-бедно работает только SmartWake. Худо-бедно, поскольку это “activity”, а не “control” или…

  • Nintendo 2DS XL

    В версии 10.2 Luma3DS научилась быстро делать скриншоты. Раньше скриншот на 3DS занимал несколько секунд, теперь почти она их делает почти…

  • Garmin Vivoactive 4

    Променял свои верные Pebble Time Steel на Garmin Vivoactive 4. На выбор были еще Garmin Venu и Garmin Fenix 6, но AMOLED экран на часах мне…

  • 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