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.()
は外から呼び出そうと思えば呼び出せるが、名前空間を作る目的なら充分に感じる。