В Ruby все является объектом. То есть, если это не метод. Каждый объект также будет принадлежать классу. Например, число 1 является экземпляром класса Integer. Чтобы узнать класс объекта в Ruby, мы можем вызвать метод #class. Итак, 1.class вернет Integer. Строка «один» также является объектом. Это экземпляр класса String. Каждый класс будет иметь множество доступных методов. Чтобы получить список этих методов, мы используем метод #methods. Например, если мы сделали 1.methods или «один».methods, мы можем увидеть список методов, доступных для каждого из этих объектов. Теперь, поскольку мы вызываем #methods для экземпляра класса, список возвращаемых методов будет называться методами экземпляра. У самого класса также будут доступные методы. Мы называем эти методы класса. Аналогичным образом мы можем использовать что-то вроде String.methods и увидеть список методов класса.

Мне нравится думать о классе как о фабрике... фабрике объектов. У фабрики есть как чертежи, так и механизмы для создания экземпляров. Методы экземпляра, определенные в классе, будут доступны каждому экземпляру этого класса. Рассмотрим следующее:

class Foo 
  attr_accessor :name 
  def bar 
    self.name + "bar"
  end 
end
foo = Foo.new
=> #<Foo:0x007f9959038c08>
foo.name = "foo"
=> "foo"
foo.bar
=> "foobar"
bar = Foo.new
=> #<Foo:0x007f9959838ef8>
bar.name = "bar"
=> "bar"
bar.bar
=> "barbar"

Выше мы определяем класс с именем Foo. Используя ключевое слово class, мы унаследовали от класса Class. Это обеспечивает некоторую базовую функциональность сразу, даже до того, как мы добавим что-либо в тело класса. Мы могли бы проверить это, вызвав Foo.class, который возвращает Class. Затем Class.methods покажет нам список методов по умолчанию, которые каждый класс имеет прямо из коробки. Затем мы определили два метода, используя attr_accessor для имени. Это дает нам два метода: #name= и #name. Наконец, мы определили #bar, который просто добавляет «foo» к имени экземпляра и возвращает его.

Хотя это не самый полезный класс, он показывает, насколько легко мы можем программировать на Ruby. Мы можем просто создать класс и, ничего не делая, создавать новые экземпляры этого класса. Заметьте, мы смогли вызвать Foo.new, даже не определяя метод #new? Каждый новый класс, который мы создаем в Ruby, наследует метод #new. Поскольку у нашего класса Foo также был метод #bar, мы могли вызывать его для каждого созданного нами экземпляра.

Хотя это гораздо более глубокая концепция, это суть базового объектно-ориентированного программирования. Мы можем создавать классы, определять методы внутри этих классов, и тогда каждый экземпляр этого класса будет реагировать на эти методы!