読者です 読者をやめる 読者になる 読者になる

気軽に楽しくプログラムと遊ぶ

自分が興味があってためになるかもって思う情報を提供しています。

Ruby Goldで問われる押さえておきたい仕様1

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(モジュール関数)

下記の2つのメソッドを同時に定義するメソッド

定義方法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はクラス名を返却。

親クラスのメソッドをサブクラスで未定義にした場合

  • undef_methodを呼び出したクラスとそのサブクラスでメソッドを呼び出し不可となる。
  • 親クラスのメソッドには影響しない。

参考URL

Rubyで独自例外を定義するときはStandardErrorを継承する - Hack Your Design!
append_features (Module) - Rubyリファレンス
ruby gold 2.1 - Qiita
module_function (Module) - Rubyリファレンス