Ruby
Теория: Модули
Одна из главных концепций в любом языке — разбиение кода на независимые модули с локальным именованием. В разных языках это делается разными словами, но похожими механизмами, такими как неймспейсы, пакеты, модули.
В Ruby для этого используется система модулей. Функции, определенные внутри модуля, локальны относительно этого модуля. То есть разные модули могут иметь внутри функции с одинаковыми именами.
При определении функции внутри модуля, к ней нужно добавлять префикс self., только в этом случае получится её вызвать напрямую из модуля. Без self. функции тоже объявляют, но только тогда, когда модуль играет роль миксина. Это очень интересная концепция, которая всё чаще встречается в других языках. Подробнее о ней в соответствующем разделе.
Вызов функции из модуля выглядит абсолютно идентично вызову методов из класса. Является ли модуль классом? Это легко проверить:
Как понять что перед нами класс, а не модуль? Короткий ответ: никак. Обычно это не проблема, потому что из контекста понятно, с чем идёт работа. В Ruby-мире много соглашений по тому, как работают библиотеки и как организуется код. Благодаря этому резко упрощается понимание происходящего.
Встроенных в Ruby модулей не так много. Из наиболее простого можно назвать Math, в котором лежат разные полезные математические функции:
Из наиболее используемых — модуль Kernel. С его помощью управляют поведением процесса и интерпретатора.
Особенность этого модуля в том, что все функции модуля Kernel доступны для вызова напрямую, без указания имени модуля. Это происходит за счёт того, что модуль Kernel "подмешан" в класс Object, от которого наследуются практически все классы в Руби (неявно).

