Files
SecondBrain/90 Library/Programming/Ruby/Ruby - основы языка.md
T
2026-05-31 10:18:48 +03:00

7.1 KiB
Raw Blame History

status, type, tags, created, updated, source, aliases
status type tags created updated source aliases
processing knowledge
programming
ruby
2026-05-17 2026-05-26
90 Library/Programming/Ruby/Ruby - основы языка
Знания Ruby
Ruby - основы языка

Ruby — основы языка

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

Связанные темы: Ruby On Rails - MOC

Синтаксис

  • Знак препинания в конце строки не нужен
  • Отступы не несут синтаксического смысла (в отличие от Python)
  • Несколько команд в одной строке разделяются через ;
puts "Hello World!"
puts 42; puts "next line"

Комментарии

# однострочный комментарий

=begin
многострочный
комментарий
=end

Типы данных

"Hello".class  # => String
true.class     # => TrueClass
5.class        # => Integer
6.4.class      # => Float
nil.class      # => NilClass

Именование

  • Переменные — с маленькой буквы: my_var
  • Классы — с большой буквы: MyClass
  • Ключевые слова языка использовать нельзя

Преобразование типов

Явное:

Метод Что делает
to_i к целому числу (дробная часть отсекается)
to_f к вещественному числу
to_s к строке

Неявное: при математических операциях Integer + FloatFloat.

Значения по умолчанию

Для присваивания значения по умолчанию часто используют ||=:

a ||= 'что-то'
# то же самое, что:
a = a || 'что-то'

Это работает из-за того, что в Ruby только nil и false считаются falsey. Все остальные значения, включая 0, пустую строку и пустой массив, в условиях считаются truthy.

Ограничение: ||= не подходит, если false — допустимое сохранённое значение.

Предикаты

В Ruby проверки часто оформляют методами-предикатами с ? на конце:

0.zero?       # => true
1.zero?       # => false
2.positive?   # => true

8.even?       # => true
8.odd?        # => false

''.empty?     # => true
'wow'.empty?  # => false

something.nil?
items.any?
items.empty?

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

# if без ветвления
if a > 0
  action
end

# if-elsif-else
if a > 0
  ...
elsif a == 0
  ...
else
  ...
end

# unless — выполнится, если условие ложно
unless a > 0
  action
end

# case
case a
when 1 then puts "один"
when 2 then puts "два"
else puts "другое"
end

Альтернативные условия

Тернарный оператор — короткая форма if/else, когда нужно выбрать одно из двух значений:

condition ? value_if_true : value_if_false

Пример:

age = 20
status = age >= 18 ? 'adult' : 'minor'
# => "adult"

Обычный if/else для того же случая:

status =
  if age >= 18
    'adult'
  else
    'minor'
  end

Тернарный оператор удобен, когда обе ветки короткие и возвращают простые значения:

message = user.nil? ? 'Гость' : user.name
price = discount ? base_price * 0.9 : base_price

Если логика занимает несколько строк, лучше использовать обычный if/else. Вложенные тернарные операторы тоже лучше не писать: они быстро становятся нечитаемыми.

Плохой вариант:

result = a > 0 ? 'positive' : a < 0 ? 'negative' : 'zero'

Постфиксный if используют для коротких выражений:

do_something if num.zero?

unless выполняет блок, если условие ложно:

unless something.zero?
  do_something
end

Сложные условия внутри unless лучше не писать: unless a && b читается хуже явного if.

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

true && false # => false
false || true # => true
!true         # => false

Сравнение с логическими значениями строгое:

true == 1    # => false
false == nil # => false

Логические операторы возвращают не обязательно true или false, а последнее вычисленное значение:

0 && 'one'    # => "one"
nil && false  # => nil

Оператор <=>

<=> называют spaceship-оператором. Он возвращает -1, 0 или 1 и часто используется при сортировке:

1 <=> 1 # => 0
2 <=> 1 # => 1
1 <=> 2 # => -1

Строки

Конкатенация:

name = 'H' + 'e' + 'x' + 'l' + 'e' + 't'
name = 'H' 'e' 'x' 'l' 'e' 't'

Интерполяция работает только в двойных кавычках:

greeting = "hello #{name}"
line_feed = "one line\nanother one"

Полезные методы:

name = 'ruby'
name.upcase      # => "RUBY"
name.include?('ru')
name.capitalize  # => "Ruby"
name.length      # => 4

Срезы:

name = 'ruby'
name[1]      # => "u"
name[-1]     # => "y"
name[0, 2]   # => "ru"
name[0..-2]  # => "rub"
name[-4..]   # => "ruby"
name[/ru/]   # => "ru"

Пример маскирования номера карты:

def prepare_card_for_display(num)
  "**#{num[-4..]}"
end

Циклы

Оператор Назначение
loop бесконечный цикл; выход через break
while цикл с условием выполнения
until цикл, пока условие ложно
for итератор по перечислимому объекту
next пропустить текущий шаг
redo повторить текущий шаг заново

Диапазоны в for:

for i in 1..5   # от 1 до 5 включительно
for i in 1...5  # от 1 до 4 (5 не входит)

Деление с остатком:

x, r = x.divmod(n)