Почему module_function создает закрытый метод при включении модуля? - PullRequest
0 голосов
/ 23 ноября 2018

Следующий код

module MyModule
 def module_func_a
  puts "module_func_a invoked"     
 end

 module_function :module_func_a
end

class MyClass
 include MyModule
end

MyClass.new.module_func_a

при выполнении при возникновении ошибки следующим образом

NoMethodError: private method `module_func_a' called for #<MyClass:0x007fb1f9026ae0>

После проверки документа для функции module_function здесь https://apidock.com/ruby/Module/module_function, обнаружил, что module_function будетсделать методы mixin закрытыми.

Но каково это сделать?

1 Ответ

0 голосов
/ 23 ноября 2018

Это часто используется для модулей, содержащих вспомогательные или служебные методы.Здесь вы можете вызвать метод непосредственно в модуле как MyModule.module_func_a.Эти методы обычно используются аналогично функциям в других языках, т. Е. Они ссылаются только на свои аргументы и не имеют внутреннего состояния.

Иногда желательно использовать множество функций такого модуля в классечто делает желательным опускать явный MyModule получатель из каждого такого метода.Таким образом, вы можете включить в класс служебный модуль, чтобы сделать методы доступными там.

Теперь, поскольку эти методы предназначены для использования во внутренней реализации методов класса, методы модуля не должныстановятся частью общедоступного интерфейса класса, так как они не добавляют никакой специфической для класса функциональности.

И именно поэтому методы становятся закрытыми, когда включены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...