Learn in 10 minutes

Learn in 10 minutes

Изучите Ruby за 10 минут

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

1. Написание вашей первой программы на Ruby

Начнем с простой программы. Создайте файл с именем hello.rb и введите следующий код:

puts "Hello, World!"

Сохраните файл и выполните следующую команду в терминале:

ruby hello.rb

Результат будет:

Hello, World!

Эта простая программа демонстрирует базовую функциональность вывода в Ruby. Метод puts используется для отображения текстовой информации в консоли.

2. Базовый синтаксис

Синтаксис Ruby чистый и читаемый, спроектированный быть естественным и интуитивно понятным.

# Это комментарий
puts "Hello, World!"

Основные правила синтаксиса в Ruby:

  • Комментарии: Однострочные комментарии начинаются с #, а многострочные используют =begin и =end.
  • Операторы: Обычно один оператор на строку, точка с запятой ; в конце не нужна.
  • Блоки кода: Определяются с помощью do...end или фигурных скобок {}.
  • Вызовы методов: Скобки необязательны для вызовов методов без аргументов.

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

=begin
Это многострочный комментарий,
охватывающий несколько строк.
=end

3. Переменные и типы данных

В Ruby переменные динамически типизированы и не требуют явных объявлений типов.

Основные правила именования переменных:

  • Имена переменных могут содержать только буквы, цифры и подчеркивания.
  • Имена переменных не могут начинаться с цифры.
  • Имена переменных чувствительны к регистру.
  • Ключевые слова Ruby нельзя использовать в качестве имен переменных.

Основные базовые типы данных в Ruby:

  • Целое число (Integer): например, 42 или -10.
  • Число с плавающей точкой (Float): например, 3.14 или 2.5e3.
  • Строка (String): например, "hello" или 'world', с использованием одинарных или двойных кавычек.
  • Логический тип (Boolean): true или false.
  • Nil: Представлен nil, обозначает нулевое или отсутствующее значение.
  • Символ (Symbol): например, :name, неизменяемые идентификаторы.

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

Ruby поддерживает целые числа и числа с плавающей точкой.

# Целое число
age = 25
population = 1_000_000  # Подчеркивания для читаемости

# Число с плавающей точкой
temperature = 36.5
pi = 3.14159

# Операции
puts 10 + 5   # 15
puts 10 / 3   # 3 (целочисленное деление)
puts 10.0 / 3 # 3.333... (деление с плавающей точкой)

3.2 Строки

Строки — это последовательности символов, заключенные в одинарные или двойные кавычки.

single_quote = 'Строка в одинарных кавычках'
double_quote = "Строка в двойных кавычках"
multiline = "Это
многострочная строка"

# Интерполяция строк (только в двойных кавычках)
name = "Alice"
greeting = "Hello, #{name}!"
puts greeting  # "Hello, Alice!"

Операции со строками:

text = "Ruby programming"
puts text.length        # Длина строки
puts text.upcase        # Преобразование в верхний регистр
puts text.downcase      # Преобразование в нижний регистр
puts text[0]            # Доступ к первому символу
puts text[0..3]         # Срез строки
puts text.include?("Ruby")  # Проверка включения

3.3 Логический тип

Логический тип имеет два значения: true и false.

is_active = true
is_complete = false

# Логические операции
result1 = true && false  # false
result2 = true || false  # true
result3 = !true          # false

3.4 Тип Nil

nil представляет нулевое или отсутствующее состояние.

value = nil

if value.nil?
  puts "Значение равно null"
end

3.5 Символы

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

:name
:email
:created_at

# Символы против строк
puts :name.object_id == :name.object_id  # true (один и тот же объект)
puts "name".object_id == "name".object_id  # false (разные объекты)

4. Структуры данных

Ruby предоставляет несколько встроенных структур данных для хранения и обработки данных.

4.1 Массивы

Массив — это упорядоченная коллекция, которая может содержать несколько значений.

numbers = [1, 2, 3, 4, 5]
numbers.push(6)        # Добавить элемент
numbers.unshift(0)     # Вставить в начало
numbers.delete(3)      # Удалить конкретное значение
numbers[0] = 10        # Изменить элемент
puts numbers.inspect   # [10, 2, 4, 5, 6]

Операции с массивами:

numbers = [10, 20, 30, 40, 50]
puts numbers[1..3]     # [20, 30, 40]
puts numbers.first     # 10
puts numbers.last      # 50
puts numbers.include?(30)  # true

4.2 Хэши

Хэш — это коллекция пар ключ-значение, похожая на словари в других языках.

student = {
  name: "John",
  age: 20,
  major: "Computer Science"
}

# Доступ и изменение хэша
puts student[:name]
student[:age] = 21
student[:gpa] = 3.8

# Итерация по хэшу
student.each do |key, value|
  puts "#{key}: #{value}"
end

5. Управление потоком выполнения

Ruby предоставляет несколько операторов управления потоком выполнения для управления выполнением программы.

5.1 Условные операторы if

Оператор if проверяет условие и выполняет свой блок, если условие истинно.

age = 20
if age >= 18
  puts "Взрослый"
elsif age >= 13
  puts "Подросток"
else
  puts "Ребенок"
end

# Однострочный if
puts "Взрослый" if age >= 18

5.2 Условные операторы unless

unless противоположен if — выполняется, когда условие ложно.

age = 15
unless age >= 18
  puts "Не взрослый"
end

# Однострочный unless
puts "Не взрослый" unless age >= 18

5.3 Операторы case

Операторы case предоставляют чистый способ обработки нескольких условий.

grade = "B"

case grade
when "A"
  puts "Отлично"
when "B"
  puts "Хорошо"
when "C"
  puts "Средне"
else
  puts "Требует улучшения"
end

5.4 Циклы

Ruby поддерживает различные конструкции циклов.

Цикл while:

count = 0
while count < 5
  puts count
  count += 1
end

Цикл until:

count = 0
until count >= 5
  puts count
  count += 1
end

Цикл for:

for i in 0..4
  puts i
end

Итератор each:

(0..4).each do |i|
  puts i
end

# С массивами
fruits = ["apple", "banana", "cherry"]
fruits.each do |fruit|
  puts fruit
end

break и next:

(0..9).each do |i|
  break if i == 5     # Выход из цикла
  next if i % 2 == 0  # Пропуск четных чисел
  puts i              # Вывод: 1, 3
end

6. Методы

Методы в Ruby определяются с использованием ключевого слова def.

Базовое определение метода:

def greet(name)
  "Hello, #{name}!"
end

# Вызов метода
message = greet("John")
puts message

Параметры по умолчанию:

def greet(name, greeting = "Hello")
  "#{greeting}, #{name}!"
end

puts greet("Alice")          # "Hello, Alice!"
puts greet("Bob", "Hi")      # "Hi, Bob!"

Переменные аргументы:

def sum_numbers(*numbers)
  numbers.sum
end

puts sum_numbers(1, 2, 3, 4)  # 10

Именованные аргументы:

def create_person(name:, age:, city: "Unknown")
  { name: name, age: age, city: city }
end

person = create_person(name: "Alice", age: 25)
puts person.inspect

7. Блоки и Procs

Блоки — это фрагменты кода, которые можно передавать методам.

Использование блоков:

# Использование do...end
3.times do
  puts "Hello!"
end

# Использование фигурных скобок
3.times { puts "Hello!" }

# Блоки с параметрами
(1..3).each do |number|
  puts "Number: #{number}"
end

Ключевое слово Yield:

def run_block
  puts "Before block"
  yield
  puts "After block"
end

run_block { puts "Inside block" }

Procs:

Procs — это объекты, инкапсулирующие блоки.

square = Proc.new { |x| x * x }
puts square.call(5)  # 25

# Передача procs в методы
def apply_operation(numbers, operation)
  numbers.map { |n| operation.call(n) }
end

numbers = [1, 2, 3, 4]
squares = apply_operation(numbers, square)
puts squares.inspect  # [1, 4, 9, 16]

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

Ruby — это чистый объектно-ориентированный язык, где все является объектом.

Базовое определение класса:

class Person
  def initialize(name, age)
    @name = name
    @age = age
  end

  def introduce
    "I am #{@name}, #{@age} years old"
  end

  def have_birthday
    @age += 1
    "#{@name} had a birthday, now #{@age} years old"
  end
end

# Создание объектов
person1 = Person.new("John", 25)
person2 = Person.new("Jane", 30)

puts person1.introduce
puts person2.have_birthday

Методы доступа:

class Person
  attr_reader :name    # Доступ на чтение
  attr_writer :age     # Доступ на запись
  attr_accessor :city  # Доступ на чтение и запись

  def initialize(name, age, city)
    @name = name
    @age = age
    @city = city
  end
end

person = Person.new("Alice", 25, "New York")
puts person.name      # "Alice"
person.age = 26       # Установить возраст
person.city = "Boston" # Установить город
puts person.city      # "Boston"

Методы класса и переменные класса:

class Student
  @@student_count = 0  # Переменная класса

  def initialize(name)
    @name = name
    @@student_count += 1
  end

  def self.student_count  # Метод класса
    @@student_count
  end
end

student1 = Student.new("John")
student2 = Student.new("Jane")
puts Student.student_count  # 2

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

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

  def speak
    "#{@name} makes a sound"
  end
end

class Dog < Animal
  def speak
    "#{@name} barks"
  end
end

class Cat < Animal
  def speak
    "#{@name} meows"
  end
end

dog = Dog.new("Buddy")
cat = Cat.new("Mimi")

puts dog.speak  # "Buddy barks"
puts cat.speak  # "Mimi meows"

9. Модули и примеси

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

Определение модуля:

module Speakable
  def speak
    "#{@name} says something"
  end
end

class Person
  include Speakable

  def initialize(name)
    @name = name
  end
end

person = Person.new("Alice")
puts person.speak  # "Alice says something"

Пространства имен с модулями:

module Math
  PI = 3.14159

  def self.square(x)
    x * x
  end
end

puts Math::PI        # 3.14159
puts Math.square(5)  # 25

10. Обработка исключений

Ruby предоставляет надежную обработку исключений с использованием begin, rescue, ensure и raise.

Базовая обработка исключений:

begin
  result = 10 / 0
rescue ZeroDivisionError => e
  puts "Нельзя делить на ноль: #{e.message}"
else
  puts "Деление успешно"
ensure
  puts "Это всегда выполняется"
end

Вызов исключений:

def divide(a, b)
  raise "Нельзя делить на ноль" if b == 0
  a / b
end

begin
  result = divide(10, 0)
rescue => e
  puts "Ошибка: #{e.message}"
end

11. Операции с файлами

Ruby предоставляет простые методы для чтения и записи файлов.

Чтение файлов:

# Чтение всего файла
content = File.read("example.txt")
puts content

# Чтение построчно
File.foreach("example.txt") do |line|
  puts line.chomp
end

Запись в файлы:

# Запись в файл
File.write("output.txt", "Hello, Ruby!\n")

# Добавление в файл
File.open("output.txt", "a") do |file|
  file.puts "Добавление нового содержимого."
end

12. Полезные встроенные методы

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

Методы строк:

text = "  Ruby Programming  "
puts text.strip        # Удаление пробелов
puts text.split(" ")   # Разделение на массив
puts text.gsub("Ruby", "Python")  # Замена

Методы массивов:

numbers = [3, 1, 4, 1, 5, 9, 2]
puts numbers.sort.inspect      # [1, 1, 2, 3, 4, 5, 9]
puts numbers.uniq.inspect      # [3, 1, 4, 5, 9, 2]
puts numbers.select { |n| n > 3 }.inspect  # [4, 5, 9]

Методы хэшей:

person = { name: "Alice", age: 25, city: "New York" }
puts person.keys.inspect    # [:name, :age, :city]
puts person.values.inspect  # ["Alice", 25, "New York"]
puts person.has_key?(:age)  # true

13. Ruby Gems

RubyGems — это менеджер пакетов Ruby для установки и управления библиотеками.

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

gem install rails

Использование гемов в коде:

require 'json'

# Парсинг JSON
json_string = '{"name": "Alice", "age": 25}'
person = JSON.parse(json_string)
puts person["name"]  # "Alice"

# Генерация JSON
person_hash = { name: "Bob", age: 30 }
json_output = JSON.generate(person_hash)
puts json_output  # {"name":"Bob","age":30}

14. Стиль кода в Ruby

Ruby имеет сильное руководство по стилю сообщества, которое способствует чистому, читаемому коду.

Отступы: Используйте 2 пробела для отступов.

Соглашения по именованию:

  • Переменные и методы: snake_case
  • Классы и модули: CamelCase
  • Константы: SCREAMING_SNAKE_CASE

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

Блоки: Используйте do...end для многострочных блоков, {} для однострочных блоков.

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