Перейти к основному содержимому

5.11. Справочник по Ruby

Разработчику Архитектору

Справочник по Ruby

1. Основные концепции языка

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

Философия языка

  • Ruby следует принципу «программиста ставят выше машины».
  • Язык стремится к выразительности и читаемости кода.
  • Ruby предоставляет множество способов выполнить одну и ту же задачу, поддерживая гибкость стиля.

Версии

Актуальная версия на момент 2026 года — Ruby 3.x. Основные изменения в третьей версии:

  • Ractors для параллельного выполнения.
  • Pattern matching.
  • Улучшенная производительность через JIT-компилятор YJIT.
  • Строгая типизация не применяется, но есть инструменты вроде RBS и Steep для аннотаций типов.

2. Типы данных

Объекты и классы

Все значения в Ruby — экземпляры классов. Даже литералы создаются как объекты:

42.class        # => Integer
"hello".class # => String
true.class # => TrueClass
nil.class # => NilClass

Числовые типы

  • Integer — целые числа произвольной точности.
  • Float — числа с плавающей запятой (IEEE 754).
  • Rational — рациональные числа (дроби без округления).
  • Complex — комплексные числа.

Примеры:

123                # Integer
123.45 # Float
Rational(3, 4) # Rational
Complex(1, 2) # Complex

Логические типы

  • true — экземпляр класса TrueClass.
  • false — экземпляр класса FalseClass.
  • Только false и nil считаются ложными в условиях. Все остальные значения — истинные.

Строки (String)

Строки в Ruby изменяемы. Поддерживают интерполяцию, кодировки, регулярные выражения.

Создание:

str = "Hello"
str = 'Hello' # Без интерполяции
str = %Q(Hello #{name})
str = %q(Hello)

Методы:

  • .length, .size
  • .upcase, .downcase, .capitalize
  • .strip, .lstrip, .rstrip
  • .gsub, .sub
  • .include?, .start_with?, .end_with?
  • .split, .join
  • .chomp, .chop
  • .ord, .chr
  • .encoding, .force_encoding

Символы (Symbol)

Символы — неизменяемые строкоподобные объекты, часто используемые как ключи хешей или имена методов.

Примеры:

:name
:"first name"
%I[apple banana]

Особенности:

  • Символы хранятся в пуле, повторное использование одного символа даёт один и тот же объект.
  • Метод .to_sym преобразует строку в символ.
  • Метод .to_s преобразует символ в строку.

Массивы (Array)

Упорядоченные коллекции объектов любого типа.

Создание:

arr = [1, 2, 3]
arr = Array.new(5, 0) # [0, 0, 0, 0, 0]
arr = %w[apple banana] # ["apple", "banana"]

Методы:

  • .length, .size, .empty?
  • .first, .last
  • .push, .pop, .shift, .unshift
  • .<< (добавление в конец)
  • .each, .map, .select, .reject, .find
  • .index, .rindex
  • .slice, .[]
  • .flatten, .compact, .uniq
  • .sort, .reverse
  • .include?
  • .zip, .transpose

Хеши (Hash)

Ассоциативные массивы с парами ключ-значение.

Создание:

hash = { name: "Alice", age: 30 }
hash = { "name" => "Alice", "age" => 30 }
hash = Hash.new("default")

Методы:

  • .keys, .values
  • .key?, .has_key?, .value?, .has_value?
  • .fetch, .[]
  • .merge, .merge!
  • .each, .each_key, .each_value
  • .transform_keys, .transform_values
  • .invert
  • .default, .default=

Диапазоны (Range)

Представляют последовательность значений между двумя границами.

Примеры:

(1..5)    # включительно
(1...5) # исключая правую границу
('a'..'z')

Методы:

  • .include?, .cover?
  • .each, .map
  • .to_a
  • .begin, .end, .exclude_end?

Регулярные выражения (Regexp)

Объекты для работы с шаблонами текста.

Создание:

/abc/
%r{abc/i}
Regexp.new("abc", Regexp::IGNORECASE)

Методы:

  • .match, .match?
  • .scan
  • .gsub, .sub
  • .source, .options

Флаги:

  • i — игнорировать регистр
  • m — многострочный режим (. захватывает \n)
  • x — расширенный синтаксис (игнорировать пробелы и комментарии)
  • o — компилировать один раз

Процедуры и блоки

  • Proc — объект, содержащий блок кода.
  • Lambda — особый вид Proc с проверкой арности.

Создание:

proc = Proc.new { |x| x * 2 }
lambda = ->(x) { x * 2 }

Методы:

  • .call
  • .arity
  • .lambda?

nil

Значение nil представляет отсутствие значения. Это единственный экземпляр класса NilClass.


3. Операторы

Арифметические

  • +, -, *, /, %, **

Сравнения

  • ==, !=, <, >, <=, >=
  • <=> — оператор сравнения (возвращает -1, 0, 1)
  • === — используется в case и для проверки принадлежности

Логические

  • &&, ||, !
  • and, or, not — с низким приоритетом

Присваивание

  • =, +=, -=, *=, /=, %=, **=
  • Параллельное присваивание: a, b = 1, 2
  • Распаковка: head, *tail = [1,2,3,4]

Условные

  • Тернарный оператор: condition ? true_val : false_val

Диапазон

  • .. — включающий диапазон
  • ... — исключающий диапазон

Обращение к методам

  • ., &. (безопасная навигация)

4. Управляющие конструкции

Условия

if condition
# ...
elsif other_condition
# ...
else
# ...
end

unless condition
# выполняется, если условие ложно
end

Модификаторы:

puts "OK" if ready?
exit unless confirmed?

Циклы

while condition
# ...
end

until condition
# ...
end

Модификаторы:

do_something while running?
retry if failed?

Итераторы (предпочтительный стиль):

5.times { puts "Hello" }
(1..10).each { |i| puts i }
array.each_with_index { |item, index| ... }

Выбор (case)

case value
when 1
# ...
when 2..5
# ...
when String
# ...
else
# ...
end

Pattern matching (Ruby 3+):

case data
in { name:, age: Integer => a } if a > 18
puts "#{name} is adult"
end

Исключения

begin
risky_operation
rescue SpecificError => e
handle_error(e)
rescue StandardError => e
log_error(e)
else
# если исключений не было
ensure
# всегда выполняется
end

Выброс исключения:

raise "Error message"
raise CustomError, "Details"

5. Методы

Определение

def method_name(param1, param2 = default, *args, **kwargs, &block)
# тело метода
return value
end

Особенности:

  • Параметры по умолчанию.
  • *args — сбор всех позиционных аргументов в массив.
  • **kwargs — сбор именованных аргументов в хеш.
  • &block — захват блока как объекта Proc.

Возврат

  • Последнее вычисленное выражение возвращается автоматически.
  • Явный return завершает метод.

Область видимости

  • private — метод вызываем только внутри объекта.
  • protected — метод вызываем только внутри объектов того же класса.
  • public — метод доступен извне.

Предопределённые методы

  • initialize — конструктор.
  • to_s, inspect — строковое представление.
  • ==, eql?, equal? — сравнение.
  • hash — для использования в хешах.
  • clone, dup — копирование.

6. Классы и объекты

Определение класса

class MyClass
def initialize(name)
@name = name
end

def greet
"Hello, #{@name}"
end
end

Переменные экземпляра

  • Начинаются с @.
  • Доступны во всех методах экземпляра.

Переменные класса

  • Начинаются с @@.
  • Совместно используются всеми экземплярами и подклассами.

Константы

  • Имена в верхнем регистре: MAX_SIZE = 100.
  • Доступны глобально, но предпочтительно ограничивать область.

Наследование

class Child < Parent
# ...
end
  • Ruby поддерживает одиночное наследование.
  • Метод super вызывает реализацию из родителя.

Модули

Модули служат для:

  • Группировки методов (Math.sqrt).
  • Реализации миксинов (через include, prepend, extend).

Пример:

module Greetable
def greet
"Hi!"
end
end

class Person
include Greetable
end

Singleton-методы и классовые методы

def MyClass.class_method
# ...
end

# или

class << self
def another_class_method
# ...
end
end

7. Стандартная библиотека Ruby

Ruby поставляется с обширной стандартной библиотекой, доступной без установки дополнительных гемов.

Работа с файлами и директориями

Класс File:

  • .read, .write, .open
  • .exist?, .file?, .directory?
  • .size, .mtime, .atime
  • .basename, .dirname, .extname

Класс Dir:

  • .entries, .foreach
  • .glob — поиск по шаблону (Dir.glob("*.rb"))
  • .mkdir, .rmdir

Модуль Pathname:

  • Объектно-ориентированный интерфейс для путей.
  • Пример: Pathname.new("docs").join("readme.md")

Время и дата

Класс Time:

  • Time.now
  • .utc, .local
  • .strftime — форматирование
  • Арифметика: Time.now + 3600

Класс Date и DateTime (из date):

  • Точное календарное представление.
  • Поддержка часовых поясов через TZInfo.

Регулярные выражения

Уже упомянуты, но дополнительно:

  • Метод String#scan возвращает все совпадения.
  • Группы захвата доступны через $1, $2, ..., $~.

Сетевые возможности

  • Net::HTTP — HTTP-клиент.
  • URI — парсинг и построение URL.
  • Socket — низкоуровневые сокеты.
  • OpenSSL — криптография и TLS.

JSON и YAML

  • JSON.parse, JSON.generate
  • YAML.load, YAML.dump (требует require 'yaml')

Потоки и параллелизм

  • Thread — потоки выполнения.
  • Mutex — примитив синхронизации.
  • Queue — потокобезопасная очередь.
  • Ractor (Ruby 3+) — изолированные акторы для параллельного выполнения без общего состояния.

Тестирование

  • Test::Unit — встроенный фреймворк.
  • minitest — современная альтернатива (часто используется как замена).
  • assert, assert_equal, assert_raises

Логирование

  • Logger — простой логгер с уровнями: debug, info, warn, error, fatal.

Утилиты

  • OptionParser — разбор аргументов командной строки.
  • CSV — работа с CSV-файлами.
  • Base64 — кодирование и декодирование.
  • Digest — хеширование (MD5, SHA1, SHA256).

8. Метапрограммирование

Ruby предоставляет мощные средства для изменения поведения программ во время выполнения.

Динамическое определение методов

define_method(:greet) do |name|
"Hello, #{name}"
end

Методы отсутствующих методов

def method_missing(name, *args)
if name.to_s.start_with?("find_by_")
# реализация динамического поиска
else
super
end
end

Рекомендуется переопределять respond_to_missing? при использовании method_missing.

Открытие классов

Любой класс можно расширить в любой момент:

class String
def blank?
self.strip.empty?
end
end

Eval-методы

  • eval — выполняет строку как код Ruby.
  • instance_eval — выполняет в контексте объекта.
  • class_eval — выполняет в контексте класса.

Интроспекция

Методы для анализа структуры:

  • .methods, .public_methods, .private_methods
  • .instance_variables, .class_variables
  • .ancestors — цепочка наследования
  • .singleton_class — класс объекта
  • .is_a?, .kind_of?, .instance_of?

Константы и модули

  • const_get, const_set, const_defined?
  • Module.nesting — текущий контекст вложенности

9. Особенности выполнения

Интерпретатор

  • Официальный интерпретатор — MRI (Matz’s Ruby Interpreter).
  • Альтернативы: JRuby (на JVM), TruffleRuby (GraalVM), Rubinius.

JIT-компиляция

  • YJIT (Yet Another JIT) — встроен в Ruby 3.3+, значительно ускоряет выполнение CPU-интенсивных задач.

Управление памятью

  • Автоматическая сборка мусора (mark-and-sweep + generational GC).
  • Настройки через переменные окружения: RUBY_GC_HEAP_INIT_SLOTS, RUBY_GC_MALLOC_LIMIT.

Загрузка кода

  • require — загружает файл один раз.
  • load — загружает каждый раз при вызове.
  • $LOAD_PATH ($:) — список путей для поиска файлов.

Переменные окружения

  • ENV — хеш с переменными окружения.
  • Пример: ENV["HOME"], ENV["RACK_ENV"]

Выход и завершение

  • exit — завершает программу.
  • exit! — немедленный выход без выполнения at_exit.
  • at_exit { ... } — блок, выполняемый при завершении.

10. Инструменты разработки

Bundler

  • Управление зависимостями через Gemfile.
  • Команды: bundle install, bundle update, bundle exec.

Rake

  • Система задач, аналог Make.
  • Файл Rakefile содержит задачи: task :build do ... end.

IRB и Pry

  • Интерактивная оболочка Ruby.
  • Pry — расширенная альтернатива с интроспекцией и отладкой.

Отладка

  • binding.irb или binding.pry — точка останова.
  • debug gem — официальный отладчик (входит в Ruby 3.1+).

Профилирование

  • ruby-prof — анализ производительности.
  • stackprof — профилировщик на основе стека.

Форматирование и стиль

  • RuboCop — проверка стиля и лучшие практики.
  • Поддерживает кастомные правила и автоматическое исправление.

Тестирование

  • RSpec — BDD-фреймворк.
  • Cucumber — acceptance-тесты на естественном языке.
  • FactoryBot — генерация тестовых данных.

11. Практические рекомендации

Именование

  • Переменные и методы: snake_case.
  • Классы и модули: PascalCase.
  • Константы: UPPER_SNAKE_CASE.

Читаемость

  • Избегать длинных методов (рекомендуется до 10–15 строк).
  • Использовать говорящие имена.
  • Предпочитать итераторы (each, map) циклам for.

Безопасность

  • Не использовать eval с пользовательским вводом.
  • Экранировать данные при работе с системой (Shellwords.shellescape).
  • Использовать параметризованные запросы при работе с базами данных.

Производительность

  • Избегать создания лишних объектов в циклах.
  • Использовать символы вместо строк как ключи хешей.
  • Кэшировать результаты тяжёлых вычислений.

Совместимость

  • Указывать версию Ruby в .ruby-version.
  • Использовать RUBY_VERSION для условной логики.
  • Тестировать на целевых версиях через CI.

12. Полезные константы и глобальные переменные

Константы

  • RUBY_VERSION — версия интерпретатора.
  • RUBY_PLATFORM — платформа (например, "x86_64-linux").
  • __FILE__ — имя текущего файла.
  • __LINE__ — номер текущей строки.
  • __dir__ — каталог текущего файла.

Глобальные переменные

  • $0 — имя запущенного скрипта.
  • $ARGV — аргументы командной строки.
  • $stderr, $stdout, $stdin — потоки ввода-вывода.
  • $? — статус последнего завершённого процесса.
  • $! — последнее исключение.
  • $@ — трассировка стека последнего исключения.

13. Распространённые идиомы Ruby

Безопасная навигация

user&.profile&.avatar_url

Хеш с блоком по умолчанию

counter = Hash.new(0)
counter[:apple] += 1

Массив как очередь

queue = []
queue << item # enqueue
item = queue.shift # dequeue

Параллельное присваивание

a, b = b, a  # обмен значениями

Блок как замыкание

def make_adder(x)
->(y) { x + y }
end
add5 = make_adder(5)
add5.(3) # => 8

Использование tap

result = [1,2,3].tap { |x| puts x.inspect }

Цепочка методов

users.select(&:active?)
.map(&:name)
.sort

14. Взаимодействие с внешними системами

Выполнение системных команд

Ruby предоставляет несколько способов запуска внешних программ:

  • Обратные кавычки:

    output = `ls -l`
  • Метод system:

    success = system("git", "status")
  • Класс Open3 (из стандартной библиотеки):

    require 'open3'
    stdin, stdout, stderr, wait_thr = Open3.popen3("grep", "pattern")
  • Класс Process: управление процессами, PID, сигналы (Process.kill, Process.wait).

Работа с переменными окружения

Доступ через хеш ENV:

ENV["DATABASE_URL"] = "postgres://..."

Изменения в ENV влияют на дочерние процессы.

Чтение аргументов командной строки

  • Глобальный массив ARGV содержит переданные аргументы.
  • Для сложного парсинга используется OptionParser:
    require 'optparse'
    options = {}
    OptionParser.new do |opts|
    opts.on("-v", "--verbose", "Run verbosely") { options[:verbose] = true }
    end.parse!

Работа с базами данных

Хотя Ruby не включает драйверы БД в ядро, стандартная практика — использование адаптеров:

  • SQLite3 — встраиваемая БД, часто используется для обучения.
  • pg — драйвер PostgreSQL.
  • mysql2 — драйвер MySQL.

Пример с SQLite:

require 'sqlite3'
db = SQLite3::Database.new('app.db')
db.execute("CREATE TABLE IF NOT EXISTS users (name TEXT)")
db.execute("INSERT INTO users VALUES (?)", ["Alice"])
db.execute("SELECT * FROM users") { |row| p row }

15. Веб-разработка на Ruby

Минимальный HTTP-сервер

require 'webrick'
server = WEBrick::HTTPServer.new(Port: 8080)
server.mount_proc('/') { |req, res| res.body = "Hello from Ruby!" }
trap('INT') { server.shutdown }
server.start

Sinatra (микрофреймворк)

Лёгкий фреймворк для создания веб-приложений:

require 'sinatra'

get '/' do
"Hello World"
end

get '/user/:name' do
"Hello, #{params[:name]}"
end

Запуск: ruby app.rb

Ruby on Rails (полноценный фреймворк)

Rails следует принципам MVC и convention over configuration.

Основные компоненты:

  • Models — работа с данными через Active Record.
  • Views — шаблоны (ERB, Slim, Haml).
  • Controllers — логика обработки запросов.
  • Routes — маршрутизация URL.
  • Migrations — управление схемой БД.
  • Gems — расширения (Devise, Sidekiq, Pundit и др.).

Пример модели:

class User < ApplicationRecord
validates :email, presence: true, uniqueness: true
has_many :posts
end

Команды Rails:

  • rails new my_app
  • rails generate model User name:string
  • rails db:migrate
  • rails server

API-разработка

Rails может работать как API-only приложение:

rails new my_api --api

Используется JSON-ответы, отключены представления и CSRF-защита.


16. Популярные гемы (библиотеки)

ГемНазначение
nokogiriПарсинг HTML/XML
httpartyУпрощённый HTTP-клиент
faradayГибкий HTTP-клиент с middleware
dotenvЗагрузка .env файлов
pryРасширенная REPL-оболочка
sidekiqФоновые задачи через Redis
rspecBDD-тестирование
factory_botФабрики для тестовых данных
rubocopАнализ стиля кода
pumaСовременный веб-сервер
dry-rbКоллекция функциональных утилит (dry-validation, dry-types)

Установка гема:

gem install gem_name

Или через Gemfile + bundle install.


17. Интеграции и реальные сценарии

Чтение и запись CSV

require 'csv'
CSV.foreach("data.csv", headers: true) do |row|
puts row["name"]
end

CSV.open("output.csv", "w") do |csv|
csv << ["name", "age"]
csv << ["Alice", 30]
end

Генерация отчётов

Сочетание ERB и File:

template = ERB.new(File.read("report.erb"))
result = template.result(binding)
File.write("report.html", result)

Автоматизация задач

Rake-файлы для ежедневных операций:

task :backup do
system("tar -czf backup.tar.gz data/")
puts "Backup created"
end

Запуск: rake backup

Телеграм-боты

С использованием гема telegram-bot-ruby:

bot = Telegram::Bot::Client.new(TOKEN)
bot.listen do |message|
bot.api.sendMessage(chat_id: message.chat.id, text: "Echo: #{message.text}")
end

18. Обучение и использование в образовательных целях

Почему Ruby подходит для обучения

  • Простой и читаемый синтаксис.
  • Минимум шаблонного кода.
  • Быстрый старт: «Hello World» — одна строка.
  • Возможность показать объектную модель без сложных абстракций.
  • Поддержка функционального стиля через блоки.

Примеры учебных задач

  1. Калькулятор — демонстрация условий и методов.
  2. Список дел (To-Do) — работа с массивами и циклами.
  3. Книжный каталог — классы, хеши, файлы.
  4. Веб-скрапингNokogiri + HTTParty.
  5. Тестирование — написание первого RSpec-теста.

Безопасность при обучении

  • Избегать выполнения пользовательского кода через eval.
  • Использовать изолированные среды (Docker, sandbox).
  • Ограничивать сетевые вызовы в учебных заданиях.

Демонстрационные проекты

  • Генератор документации.
  • Консольный чат с логированием.
  • REST-клиент для публичного API (например, GitHub).
  • Скрипт резервного копирования.

19. Советы по структуре проекта

Хорошо организованный Ruby-проект включает:

my_project/
├── bin/ # исполняемые скрипты
├── lib/ # основной код
│ └── my_project.rb
├── spec/ # тесты (если используется RSpec)
├── test/ # тесты (если используется Minitest)
├── Gemfile # зависимости
├── Gemfile.lock # зафиксированные версии гемов
├── README.md # описание проекта
├── Rakefile # задачи автоматизации
├── .ruby-version # версия Ruby
├── .rubocop.yml # правила стиля
└── config.ru # если это Rack-приложение

Для библиотек — модульное пространство имён:

# lib/my_project/core.rb
module MyProject
class Core
# ...
end
end