Ruby Goldの出題範囲として認知があまりされていないが重要な部分を以下にまとめる。
Module#append_features
インクルード機能の本体にあたるメソッド。モジュールインクルード前に呼び出される
引数にはインクルードするモジュールが入る
Module#included
モジュールインクルード後に呼び出される
include後にやりたい処理を実装しておくと、フックメソッドとして使用可能
module MyModule # includeされたら以下のメソッドが実行される def self.included(include_class_name) puts "MyModlueは#{include_class_name}にmixinされた" end end class MyClass include MyModule end #=>MyModlueはMyClassにmixinされた
Module#module_function(モジュール関数)
定義方法1(module_function引数あり)
module MyModule def my_method puts "my_method" end module_function :my_method end puts MyModule.my_method #=> my_method
定義方法2(module_function引数なし)
module MyModule module_function # これ以降に記述したメソッドはすべてモジュール関数となる def my_method puts "my_method" end end puts MyModule.my_method #=> my_method
module_functionを含むModuleをインクルードした場合の挙動
module MyModule module_function # これ以降に記述したメソッドはすべてモジュール関数となる def my_method puts "my_method" end end class C include MyModule def test_method my_method end end c = C.new p c.my_method #=> NoMethodError: undefined method my_method # インスタンスメソッドは自動的にprivateメソッドになる p c.test_method #=> my_method
クラスメソッドとの違い
プライベートメソッドを同時に定義できる。
includeしてインクルードクラス内でレシーバなしで使用可能
モジュールMathに対して呼ぶ
という2通りのやり方で使用することが出来ます。
補足
インスタンスメソッドをundefしてもクラスメソッドは使用可能
undefとundef_method
指定可能な引数
udefでメソッド削除
class C def foo puts 'foo' end undef foo #=> 削除OK end class C def foo puts 'foo' end undef :foo #=> 削除OK end class C def foo puts 'foo' end undef 'foo' #=> SyntaxError: unexpected tSTRING_BEG undef 'foo' end
udef_methodでメソッド削除
class C def foo puts 'foo' end undef_method foo #=> NameError: undefined local variable or method `foo' for C:Class end class C def foo puts 'foo' end undef_method :foo #=> C 削除OK end class C def foo puts 'foo' end undef_method 'foo' #=> C 削除OK end
udefは文なので返却値なし。undef_methodはクラス名を返却。
親クラスのメソッドをサブクラスで未定義にした場合
参考URL
Rubyで独自例外を定義するときはStandardErrorを継承する - Hack Your Design!
append_features (Module) - Rubyリファレンス
ruby gold 2.1 - Qiita
module_function (Module) - Rubyリファレンス