Object#extend
имеет для публичного доступа, иначе вы не сможете его использовать. В конце концов, его целью является объединение модуля в объект, так что вы обычно называете его как obj.extend(Foo)
, что невозможно при использовании частных методов.
Module#include
обычно используется только внутри корпуса модуля, например:
class Bar
include Foo
end
т.е. обычно он вызывается без получателя, поэтому он не должен быть публичным. Конечно, также не должен быть приватным.
Я полагаю, причина, по которой он является частным, заключается в том, что он более инвазивен, поскольку он изменяет поведение каждого экземпляра Bar
, тогда как Object#extend
изменяет только один объект. Следовательно, Module#include
в некотором смысле «более опасен» и, таким образом, становится приватным.
Я не знаю, является ли это действительной причиной, но это согласуется с другими подобными методами, такими как Module#define_method
.