Просто чтобы расширить ответ, данный bor1s, о приватных методах:
В ruby у вас есть "приватный" и "защищенный" методы. То, что говорит bor1s, верно, когда речь идет о «защищенных» методах. Объявление метода "private" дополнительно запрещает другим экземплярам того же класса использовать метод.
Когда вы вызываете «закрытый» метод, вы не можете использовать точку перед ним - вы даже не можете использовать self.
, даже если использование или пропуск self
обычно имеет тот же эффект.
class Xyzzy
private
def foo
puts "Foo called"
end
public
def do_it
foo # <= Is OK
self.foo # <= raises NoMethodError
end
end
Xyzzy.new.do_it
Если вы измените 'private' на 'protected' в приведенном выше коде, ошибка не возникнет.
А по поводу модулей:
Окончательный результат определения метода в Kernel
и расширения Kernel
методом, определенным в некотором модуле, одинаков: в обоих случаях метод является глобальным.
Использование модуля немного более элегантно, поскольку оно группирует ваши изменения в одном месте, но я бы сказал, что это вопрос личного вкуса.
Обычно вы не включаете методы в ядро или объект (как это может быть немного опасно), но вы включаете (или расширяете) определенный класс или объект, который нуждается в этих методах, и в этом случае вам нужен ваши методы сгруппированы в модуле.
Даже Rake в версии 0.9.0 остановлен, включая команды DSL в Object:
== Версия 0.9.0
- Несовместимо * change *: Команды Rake DSL («задача», «файл» и т. Д.)
больше не частные методы в Object. Если вам нужно вызвать 'task: xzy' внутри
ваш класс, включите Rake :: DSL в класс. DSL все еще доступен на
область верхнего уровня (через объект верхнего уровня, который расширяет Rake :: DSL).