Модуль в ruby можно использовать для 3-х возможных вещей
1. Пространства имен
Это довольно просто.
module Foo
class Bar
end
end
f = Foo::Bar.new
2. Сборник функций
Иногда у вас будут некоторые функции, которые не вписываются ни в один класс. В чем-то вроде java, вы бы просто поместили их как набор статических методов в класс. В ruby вы бы поместили их в модуль, поскольку наличие их в классе подразумевает, что класс предназначен для создания экземпляра
module FooHelper
def self.bar
puts 'hi'
end
end
FooHelper.bar # => hi
3. Примеси
Это труднее всего понять из всех 3. По сути, это ответ Ruby на множественное наследование в C или интерфейсы в Java.
Иногда у вас есть логика, которая принадлежит нескольким классам, но в то же время не подходит как родительский класс. Mixin описывает "смешивание" методов модулей в классе. На самом деле это намного больше, но на очень высоком уровне это будет выглядеть так:
module CanFoo
def foo
puts 'bar'
end
end
class Baz
include CanFoo
end
class Bar
include CanFoo
end
baz.new.foo # => bar
bar.new.foo # => bar
Миксины - довольно сложная тема, и вам потребуется некоторое время, чтобы понять, когда вы будете использовать один из них над суперклассом. IMO - это одна из самых крутых возможностей ruby, которая решает проблему множественного наследования с гораздо большей элегантностью, чем любой другой язык OO, на который я смотрел.