Шпаргалка по Ruby
Последнее обновление
Hello World и запуск кода
Ruby не требует шаблонного кода - запускается одна строка.
| Операция | Синтаксис |
|---|---|
| Вывести с переводом строки | puts "Hello, World!" |
| Вывести без перевода строки | print "Hello" |
| Осмотреть значение | p [1, 2, 3] |
| Интерполяция строк | puts "Hi #{name}" |
| Комментарий | # this is a comment |
| Многострочный комментарий | =begin ... =end |
| Запустить файл | ruby app.rb |
| Интерактивная оболочка | irb |
Переменные и типы
Ruby динамически типизирован; всё является объектом.
| Операция | Синтаксис |
|---|---|
| Локальная переменная | age = 30 |
| Константа | PI = 3.14 |
| Переменная экземпляра | @name = "Ada" |
| Глобальная переменная | $count = 0 |
| Символ | :status |
| Nil / логические | nil, true, false |
| Узнать тип | 42.class возвращает Integer |
| Преобразовать тип | "42".to_i, 42.to_s, "3.5".to_f |
Строки
Строки - изменяемые объекты с богатым набором методов.
| Операция | Синтаксис |
|---|---|
| Длина | "hello".length |
| Верхний / нижний регистр | s.upcase, s.downcase |
| Убрать пробелы по краям | s.strip |
| Заменить | s.gsub("a", "b") |
| Разбить в массив | "a,b,c".split(",") |
| Содержит подстроку | s.include?("ell") |
| Срез символов | s[0..2] |
| Конкатенация | "foo" + "bar", s << "!" |
| Повтор | "ab" * 3 |
| Форматирование | format("%05d", 42) |
Массивы
Упорядоченные коллекции с целочисленными индексами.
| Операция | Синтаксис |
|---|---|
| Создать | nums = [1, 2, 3] |
| Доступ по индексу | nums[0], nums[-1] |
| Добавить в конец | nums.push(4), nums << 4 |
| Удалить с конца | nums.pop |
| Длина | nums.length |
| Map | nums.map { |n| n * 2 } |
| Фильтрация | nums.select { |n| n.even? } |
| Свёртка | nums.reduce(0) { |sum, n| sum + n } |
| Сортировка | nums.sort |
| Объединить в строку | nums.join(", ") |
Хеши
Коллекции ключ-значение, часто с символами в качестве ключей.
| Операция | Синтаксис |
|---|---|
| Создать | user = { name: "Ada", age: 30 } |
| Получить значение | user[:name] |
| Задать значение | user[:email] = "a@x.com" |
| Проверить ключ | user.key?(:name) |
| Удалить ключ | user.delete(:age) |
| Ключи / значения | user.keys, user.values |
| Перебор | user.each { |k, v| puts "#{k}: #{v}" } |
| Значение по умолчанию | Hash.new(0) |
| Слияние | h1.merge(h2) |
Управление потоком
Условия и циклы; обратите внимание на завершающие модификаторы Ruby.
| Операция | Синтаксис |
|---|---|
| If / elsif / else | if x > 0 ... elsif x < 0 ... else ... end |
| Однострочный if (модификатор) | puts "hi" if ready |
| Unless | unless done ... end |
| Тернарный оператор | x > 0 ? "pos" : "neg" |
| Case / when | case n; when 1 then ...; else ...; end |
| Цикл while | while i < 10 ... end |
| Цикл until | until done ... end |
| Times | 5.times { |i| puts i } |
| Итерация по диапазону | (1..5).each { |i| puts i } |
| Break / next | break, next |
Методы
Последнее выражение возвращается неявно.
| Операция | Синтаксис |
|---|---|
| Определить метод | def add(a, b) ... end |
| Неявный возврат | def square(x) x * x end |
| Аргумент по умолчанию | def greet(name = "World") ... end |
| Именованные аргументы | def box(w:, h:) ... end |
| Splat (вариативный) | def sum(*nums) ... end |
| Метод, оканчивающийся на ? | def valid? ... end |
| Метод, оканчивающийся на ! | def normalize! ... end |
| Вызов без скобок | greet "Ada" |
Блоки, proc и лямбды
Блоки - это фрагменты кода, передаваемые методам; proc и лямбды их хранят.
| Операция | Синтаксис |
|---|---|
| Блок (фигурные скобки) | [1, 2].each { |n| puts n } |
| Блок (do/end) | [1, 2].each do |n| puts n end |
| Передать управление блоку (yield) | def run; yield; end |
| Проверка наличия блока | block_given? |
| Захватить блок как параметр | def run(&blk); blk.call; end |
| Создать proc | square = proc { |x| x * x } |
| Создать лямбду | square = ->(x) { x * x } |
| Вызвать proc / лямбду | square.call(3), square.(3) |
Классы и модули
Классы хранят состояние и поведение; модули подмешивают общие методы.
| Операция | Синтаксис |
|---|---|
| Определить класс | class Point ... end |
| Конструктор | def initialize(x, y) @x = x; @y = y; end |
| Метод экземпляра | def dist ... end |
| Сокращения для аксессоров | attr_accessor :x, :y |
| Создать экземпляр | p = Point.new(1, 2) |
| Наследование | class Circle < Shape ... end |
| Метод класса | def self.origin ... end |
| Определить модуль | module Drawable ... end |
| Подмешать модуль | include Drawable |
| Вызвать super | super(args) |
Синтаксис Ruby, который нужен чаще всего, на одной странице. Эта шпаргалка по Ruby - быстрый справочник по ядру языка: переменные и типы, строки, массивы и хеши, управление потоком, методы, а также блоки, proc и лямбды, делающие Ruby таким выразительным.
Всё здесь - чистый Ruby, который работает на любом стандартном интерпретаторе. Копируйте нужное или попробуйте каждый фрагмент вживую в playground для Ruby - без установки.
Часто задаваемые вопросы по шпаргалке Ruby
Эта шпаргалка по Ruby бесплатна?
В чём разница между блоком, proc и лямбдой?
{ ... } или do ... end; сам по себе он не является объектом. proc оборачивает блок в вызываемый объект, который можно хранить и передавать. lambda - это особый proc, который строго проверяет количество аргументов и трактует return как возврат из самой лямбды, тогда как обычный proc возвращает управление из окружающего метода.Что такое символы в Ruby?
:name - это неизменяемый, переиспользуемый идентификатор. Поскольку один и тот же символ всегда указывает на один объект в памяти, символы быстрее и экономнее по памяти, чем строки, для таких вещей, как ключи хешей и имена методов - поэтому хеши часто записывают как { name: "Ada" }.