Rubyがミニツク

あなたのRubyの技術に関するより詳しい知識と理解を増やします。

Ruby入門コース

このコースについて

Rubyのeラーニング研修システムはRailsを使ってWebアプリケーション開発ができる技術者の育成を目指します。 そのため、Railsを扱うことができるだけのRubyの知識を得ることがRuby入門コースの目標となっています。

コンテンツ一覧

ヒント レッスンの名前をクリックすると、その内容を表示します。

次のコンテンツ ホームへ戻る

特異メソッド

特定の1つのオブジェクトだけで使うことができるメソッドのことを特異メソッドと呼びます。メソッド定義において、メソッド名を「オブジェクト.メソッド名」の形で定義することができます。以下のようにすると特異メソッドを定義できます。

obj = Object.new
def obj.foo
  puts("foo")
end

Rubyではすべての要素がオブジェクトであり、クラスやモジュールもオブジェクトなので特異メソッドを定義できます。クラスメソッドと呼んでいたメソッドは定義するやり方が違っていますが特異メソッドです。モジュールでは以下のように定義することができます。

# def self.メソッド名; end
module Foo
  def self.foo
    puts("foo")
  end
end
Foo.foo  #=> foo

# def モジュール.メソッド名; end
module Bar
  def Bar.bar
    puts("bar")
  end
end
Bar.bar  #=> bar

特異メソッドを定義することによって、レシーバにモジュールを指定する形でメソッドを呼び出すことができました。
ただし、モジュールには「モジュール.メソッド名」の形でメソッドを呼び出せるモジュール関数があります。特異メソッドもレシーバにモジュールを指定した形でメソッドを呼び出します。これらのメソッドには違いがあり、モジュール関数はインクルードした時にインスタンスメソッドとして渡されます。特異メソッドとして定義されたメソッドはインクルードした時に渡しません。

module Foo
  def self.foo
    puts("foo")
  end
end
module Bar
  include Foo
end
Foo.foo  #=> foo
Bar.foo
NoMethodError: undefined method `foo' for Bar:Module
    from (irb):9
    from :0

モジュール関数はインクルードすることによって、インスタンスメソッドとしてインクルード先で使うことができます。

module Foo
  def foo
    puts("foo")
  end
  module_function :foo
end
class Bar
  include Foo
  def bar
    foo
  end
end
bar = Bar.new
bar.foo  #=> foo


次のコンテンツ ホームへ戻る