Ruby: Ruby, Ruby, Ruby

Ruby на нашем проекте дается как «второй язык» — это значит, что мы подразумеваем определенный багаж знаний у тех, кто учится ему здесь. В первую очередь это владение каким-либо другим языком программирования. Для понимания материала курса нужно иметь представление о типах данных, переменных, условных конструкциях, циклах, функциях, объектах (свойствах и методах) и лямбда-функциях (анонимных функциях).

Изучение второго языка значительно проще первого, поэтому и структура материала сильно меняется. Здесь мы обзорно касаемся базовых конструкций для быстрого знакомства с синтаксисом, и переходим к интересным задачкам, ради которых, собственно, и изучается Ruby.

В чём соль?

Ruby — динамический, строго типизированный язык с глубоким уклоном в объектно-ориентированную и функциональную парадигму программирования.

# Строгая типизация, число нельзя умножить на строку
4 * 'hexlet' # TypeError (String can't be coerced into Integer)
# Все объекты
1.8.round # 2
# функции высшего порядка
['one', 'two'].map(&:upcase) # ["ONE", "TWO"]

Он обладает местами непривычным, но невероятно выразительным синтаксисом. Благодаря этому код на Ruby читается как английский язык и при этом остается компактным:

# Определение конечного автомата
class Job
  include AASM

  aasm do
    state :sleeping, initial: true
    state :running, :cleaning

    event :run do
      transitions from: :sleeping, to: :running
    end

    event :sleep do
      transitions from: [:running, :cleaning], to: :sleeping
    end
  end
end

job = Job.new
job.sleeping? # true
job.may_run?  # true
job.run
job.running?  # true
job.may_run?  # false

На Ruby создано большое количество решений, которые потом распространились по другим языкам. Самым ярким примером является фреймворк Ruby On Rails, который когда-то перевернул веб-разработку, и до сих пор является самым продвинутым бэкенд фреймворком для веб-разработки. И github.com, и gitlab.com написаны с использованием Rails. Даже этот сайт написан на Rails.

В Ruby очень много метапрограммирования, встроенного во все части языка. Это значит, что программа может менять свое поведение прямо во время работы практически в любую сторону. Посмотрите, как происходит добавление методов во встроенные классы:

# Этот код можно написать в любом месте программы
class String # встроенный в Ruby класс, отвечающий за строки
  def wow # определение метода
   'ruby power'
  end
end

# Вызываем метод
'hexlet'.wow # 'ruby power'

И даже так:

# Только для демонстрации
# Класс New наследуется от случайно выбранного класса One или Two,
# в зависимости от того, какой из них выберет метод sample на момент загрузки файла с классом
class New < [One, Two].sample
  # тут код класса
end

На этом моменте у вас возможно возникла мысль «это же ад». Как и любой мощный инструмент, Ruby можно использовать во зло — это правда, но если посмотреть на реальное положение дел, то при правильном использовании Ruby позволяет писать невероятно выразительный код. И раз вы здесь, то давайте научимся это делать.

Задание

На данном этапе мы знаем ещё слишком мало, чтобы писать какой-то интересный код, поэтому просто скопируйте и выполните код ниже. В этом коде используется библиотека ActiveSupport, которая расширяет язык некоторыми полезными возможностями. Изначально она была создана для Rails, но используется и за его пределами.

# На сервере время в UTC
# Считаться будет от него
puts 1.day.ago - 1.week + 3.hours

Советы


Нашли ошибку? Есть что добавить? Пулреквесты приветствуются https://github.com/hexlet-basics
Если вы столкнулись с трудностями и не знаете, что делать, задайте вопрос в нашем большом и дружном сообществе