電波ビーチ

☆(ゝω・)v

特異メソッドにしたいだけ、ならばmodule_functionは要らない

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

参考

qiita.com