Ruby — чисто объектно-ориентированный язык — вы определяете классы (шаблоны) и создаёте объекты (экземпляры). Классы используют initialize как конструктор, @variables для состояния экземпляра и модификаторы доступа для инкапсуляции. Синтаксис классов в Ruby чистый и выразительный.
Определение класса
class Person
def initialize(name, age) # the CONSTRUCTOR (called on .new)
@name = name # @ → instance variable (per object)
@age = age
end
def greet # an instance method
"Hi, I'm #{@name}"
end
end
person = Person.new("Ann", 30) # create an instance (calls initialize)
person.greet # "Hi, I'm Ann"
Метод initialize — это конструктор (вызывается автоматически методом .new), а переменные экземпляра @name хранят состояние конкретного объекта. Методы определяются с помощью def.
Доступ к переменным экземпляра (требуются методы доступа)
class Person
attr_accessor :name # generates getter AND setter for @name
attr_reader :age # getter only (read-only)
def initialize(name, age)
@name = name
@age = age
end
end
person.name # "Ann" — getter
person.name = "Bob" # setter
Переменные экземпляра (@name) по умолчанию приватные — вы предоставляете доступ к ним через методы доступа. attr_accessor/attr_reader/attr_writer автоматически генерируют эти методы получения/установки (удобство Ruby).
Контроль доступа и методы класса
class Account
def deposit(amount) # public by default
update_balance(amount)
end
private # methods below are PRIVATE
def update_balance(amount)
@balance += amount
end
def self.create # CLASS method (self.) — called on the class, not an instance
new(...)
end
end
Account.create # class method
Методы публичны по умолчанию; private/protected ограничивают доступ. def self.method определяет метод класса (вызывается на самом классе).
Почему это важно
Классы и объекты — основа Ruby, чисто объектно-ориентированного языка, поэтому понимание их необходимо для любой разработки на Ruby — практически весь код на Ruby (и фреймворки вроде Rails) организован в классы.
Знание того, как определить класс с конструктором initialize, использовать переменные @instance для состояния конкретного объекта (и что они по умолчанию приватные, требуя методов доступа для предоставления доступа), определить методы экземпляра и методы класса (def self.method), а также применить контроль доступа (private/protected) — это фундаментальное повседневное знание.
Особенно важное удобство Ruby — attr_accessor/attr_reader/attr_writer, которые автоматически генерируют методы получения/установки для переменных экземпляра — избавляя от шаблонного кода и отражая элегантность Ruby (вместо написания явных getter'ов/setter'ов, как во многих языках, вы объявляете их в одну строку).
Понимание чистого синтаксиса классов Ruby, модели конструктора и переменных экземпляра, методов доступа и методов класса — это основной, обязательный материал для объектно-ориентированного Ruby.
Поскольку классы — это способ моделирования данных и поведения во всех приложениях Ruby, и поскольку возможности классов Ruby (соглашение initialize, переменные экземпляра @, accessor'ы attr_*, контроль public/private) — это то, как пишется объектно-ориентированный Ruby, овладение ими — это необходимое, фундаментальное знание, которое лежит в основе всей разработки на Ruby и часто является отправной точкой для понимания объектно-ориентированной природы языка.
