Вы спрашиваете разницу между методом класса и методом экземпляра.
Существует несколько способов определения метода класса:
class Klass
def Klass.method_name
..
end
end
, что аналогично действию:
class Klass
def self.method_name
..
end
end
или предпочитаемая идиома рубина:
class Klass
class << self
def method_name
..
end
end
end
Если Класс уже объявлен, вы также можете сделать ..
def Klass.method_name
..
end
или:
class << Klass
def method_name
..
end
end
или вы можете даже использовать Модуль # extension:
Klass.extend(Module.new { def method_name; puts 'ducky'; end })
Так же, как вы бы добавили одноэлементный метод к объекту. Фактически методы класса - это одноэлементные методы, которые работают на уровне класса.
Например, в рельсах ActiveRecord у вас есть метод класса 'find', который вы можете использовать в любой модели:
Person.find(1)
и экземпляры методов типа 'save', которые работают с отдельным объектом
person = Person.find(1)
...
person.save
В текущем проекте, над которым я работаю, у меня есть модель Feed, которая содержит каналы данных. Периодически мне нужно запускать метод, который обновляет все каналы, поэтому у меня есть метод fetch_all, который выполняет это.
class Feed < ActiveRecord::Base
// class method Feed.fetch_all
def self.fetch_all
Feed.all.each do |feed|
feed.fetch_value
end
end
// instance method
def fetch_value
// grabs updated value and saves
end
end