Самый распространенный и читаемый способ:
class MyClass
def self.class_method
"Это метод класса"
end
end
MyClass.class_method # => "Это метод класса"
Полезно при определении нескольких методов класса:
class MyClass
class << self
def first_class_method
"Первый метод класса"
end
def second_class_method
"Второй метод класса"
end
end
end
Позволяет вынести методы класса в отдельный модуль:
module ClassMethods
def class_method
"Метод из модуля"
end
end
class MyClass
extend ClassMethods
end
MyClass.class_method # => "Метод из модуля"
Технически, методы класса - это singleton-методы класса:
class MyClass; end
def MyClass.class_method
"Метод через singleton-класс"
end
Динамическое создание методов класса:
MyClass.define_singleton_method(:dynamic_method) do
"Динамически созданный метод класса"
end
class Product
def self.create_default
new(name: "Default", price: 0)
end
def initialize(name:, price:)
@name = name
@price = price
end
end
default_product = Product.create_default
class MathUtils
def self.circle_area(radius)
Math::PI * radius**2
end
end
MathUtils.circle_area(5) # => 78.53981633974483
module Pagination
def per_page(count)
@per_page = count
end
end
class Post
extend Pagination
end
Post.per_page(25) # Устанавливает значение для класса
Ruby реализует методы класса через:
MyClass.singleton_class.ancestors
# => [#<Class:MyClass>, #<Class:Object>, #<Class:BasicObject>, Class, Module, Object, Kernel, BasicObject]
self.method
для одиночных методовclass << self
для групп методовclass MyClass
def self.method_a
"классовый"
end
def method_a
"экземпляра"
end
end
Резюмируем: методы уровня класса в Ruby создаются несколькими способами, наиболее популярные - через self.method_name
и class << self
блок. Они являются важной частью объектно-ориентированного дизайна в Ruby, позволяя реализовывать функциональность, относящуюся ко всему классу, а не к отдельным экземплярам. Понимание их работы и правильное применение способствует созданию чистой и поддерживаемой архитектуры.