module_function
moduleに普通にメソッドを定義するとインスタンスメソッドとして定義される。
module Foo def foo end puts instance_methods.include?(:foo) #=> true puts private_instance_methods.include?(:foo) #=> false puts singleton_methods.include?(:foo) #=> false end
classにincludeして使う。
class Bar include Foo end Bar.new.foo
module_function
を使うと、instance_methods
から消えてprivate_instance_methods
とsingleton_methods
に追加される。
module Foo module_function def foo end puts instance_methods.include?(:foo) #=> false puts private_instance_methods.include?(:foo) #=> true puts singleton_methods.include?(:foo) #=> true end
モジュールから直接呼んだり
Foo.foo
includeしたclassでレシーバーなしでアクセスできるようになる。
class Bar include Foo def hoge foo end end
Bar.new.foo #=> NoMethodError
include
する使い方をしないのであればsingleton_method
だけ定義するだけでもいい。
module Foo def self.foo end puts instance_methods.include?(:foo) #=> false puts private_instance_methods.include?(:foo) #=> true puts singleton_methods.include?(:foo) #=> false end
Foo.foo