module_function
を使うと確かに特異メソッドが作れる。が、それで作られるメソッドは、同時にプライベートメソッドでもある。( 参考:伊藤淳一「プロを目指すためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで」kindle版 , 技術評論社, 位置 7425 )
hoge.rb
module Hoge module_function def hoge(n) "ほげ"*n end end
main.rb
require_relative 'hoge' def yobu puts Hoge.hoge(3) end yobu
結果
ほげほげほげ
Hoge
には外部から呼び出すためのメソッドだけおいておけばいい、という場合に、プライベートメソッドは不要である。むしろ上記の場合だとmain.rbから呼ぶ際にレシーバを指定する方法がそもそも無いのでプライベートメソッドは必要ない。(ここんとこ理解および日本語があやしいかもしれないので間違ってたらそっと教えてください)
解決法
特異クラスにしてやればよい。
hoge.rb
module Hoge # module_function <- プライベートメソッドは必要ない class << self def hoge(n) "ほげ"*n end end end