Ruby の Module 覚え書き

module Example
  def a
    output "inner"
  end

  def output(st)
    puts st
  end
end

include Example
output "outer"    #=>"outer"
a                 #=>"inner"

include すればモジュール内のメソッドがふつうに使える。

module Example
  def a
    output "inner"
  end

  def output(st)
    puts st
  end
  module_function :a, :output
end

Example.a         #=>"inner"
output "outer"    #=>NoMethodError

include しないなら、module_function の指定をするなどしないと呼べない。その際、メソッド内部で呼ばれているメソッドも、module_function の指定をしないと呼べない。なお、module_function の指定をしても、include すれば上と同じように呼べる。
 
自分でこんな解決策も考えた。
obelisk.hatenablog.com
 
定数と Proc を使うという手もある。

module Example
  def a
    Output.("inner")
  end
  module_function :a
  
  Output = ->(st) {puts st}
end

Example.a                    #=>"inner"
Example::Output.("outer")    #=>"outer"
Output.("outer")             #=>NameError

Output.() は外から呼び出そうと思えば呼び出せるが、名前空間を作る目的なら充分に感じる。