Объясните, как создать метод уровня класса.ruby-18

Основные способы создания методов класса

1. Использование self. в определении класса

Самый распространенный и читаемый способ:

class MyClass
  def self.class_method
    "Это метод класса"
  end
end

MyClass.class_method # => "Это метод класса"

2. Использование блока class << self

Полезно при определении нескольких методов класса:

class MyClass
  class << self
    def first_class_method
      "Первый метод класса"
    end

    def second_class_method
      "Второй метод класса"
    end
  end
end

3. Использование extend с модулем

Позволяет вынести методы класса в отдельный модуль:

module ClassMethods
  def class_method
    "Метод из модуля"
  end
end

class MyClass
  extend ClassMethods
end

MyClass.class_method # => "Метод из модуля"

4. Определение метода в singleton-классе

Технически, методы класса - это singleton-методы класса:

class MyClass; end

def MyClass.class_method
  "Метод через singleton-класс"
end

5. Использование define_singleton_method

Динамическое создание методов класса:

MyClass.define_singleton_method(:dynamic_method) do
  "Динамически созданный метод класса"
end

Практические примеры

1. Фабричные методы

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

2. Методы-помощники

class MathUtils
  def self.circle_area(radius)
    Math::PI * radius**2
  end
end

MathUtils.circle_area(5) # => 78.53981633974483

3. Подключение через extend

module Pagination
  def per_page(count)
    @per_page = count
  end
end

class Post
  extend Pagination
end

Post.per_page(25) # Устанавливает значение для класса

Особенности методов класса

  1. Вызываются на классе, а не на экземпляре
  2. Не имеют доступа к переменным экземпляра
  3. Могут быть унаследованы подклассами
  4. Технически являются singleton-методами класса

Как работают методы класса

Ruby реализует методы класса через:

  1. Singleton-класс каждого класса
  2. Цепочку наследования singleton-классов
  3. Поиск методов в иерархии:
MyClass.singleton_class.ancestors
# => [#<Class:MyClass>, #<Class:Object>, #<Class:BasicObject>, Class, Module, Object, Kernel, BasicObject]

Лучшие практики

  1. Используйте self.method для одиночных методов
  2. Применяйте class << self для групп методов
  3. Выносите в модули большие наборы методов класса
  4. Избегайте излишнего усложнения
  5. Документируйте назначение методов класса

Ошибки и подводные камни

  1. Путаница с self:
class MyClass
  def self.method_a
    "классовый"
  end

  def method_a
    "экземпляра"
  end
end
  1. Избыточное использование методов класса вместо модулей
  2. Нарушение SRP при слишком большом количестве методов класса

Резюмируем: методы уровня класса в Ruby создаются несколькими способами, наиболее популярные - через self.method_name и class << self блок. Они являются важной частью объектно-ориентированного дизайна в Ruby, позволяя реализовывать функциональность, относящуюся ко всему классу, а не к отдельным экземплярам. Понимание их работы и правильное применение способствует созданию чистой и поддерживаемой архитектуры.