コンテンツにスキップ

メソッド

メソッドの優先順位

同じ名前の変数とメソッドがある場合は変数の方が優先される。

foo = "hi"

def foo(msg = "hello")
  puts msg
end

foo         # => "hi"     / 変数が呼び出される
foo()       # => "hello"  / メソッドが呼び出される
foo "bye"   # => "bye"    / メソッドが呼び出される
foo foo     # => "hi"     / メソッドの引数に変数 "hi" を与えて呼び出される

また、obj というオブジェクトがあり、obj.m というメソッド呼び出しがあった場合、以下の優先順位でメソッドを探索する。

  1. obj の特異メソッド
  2. obj のクラスの m というインスタンスメソッド
  3. obj のクラスがインクルードしているモジュールのインスタンスメソッド(include された順とは逆順でモジュールを探索する)
  4. スーパークラスのインスタンスメソッド
  5. スーパークラスがインクルードしているモジュールのインスタンスメソッド
  6. 見つからない場合、metod_missing メソッドの呼び出し。

メソッドの種類

特異メソッド(Singleton method)

  • 特定のオブジェクト固有のメソッド。
obj = "object"           # Stringクラスのオブジェクト

def obj.hello            # objの特異メソッド
  puts "hello " + self
end

obj.hello                # => "hello object"

obj2 = "object2"
obj2.hello               # helloはobjの特異メソッドなのでobj2では使えない

インスタンスメソッド

  • インスタンスオブジェクトから呼び出せるメソッド。
class Greeting
  def hello              # Greetingクラスのインスタンスメソッド 
    puts "hello"
  end
end

obj = Greeting.new
obj.hello                # => "hello"

Greeting.hello           # インスタンスメソッドのため、インスタンスからでしか呼べない

クラスメソッド

  • クラスオブジェクトが持つメソッド。インスタンスを生成せずに呼び出せる。
class Greeting
  def self.hello         # Greetingクラスのクラスメソッド 
    puts "hello"
  end
end

Greeting.hello           # => "hello"

インクルードされたモジュールのインスタンスメソッド

  • include Hoge と書くことで、Hoge モジュールが他のところでも使えるようになる。
module Greeting
  def hello
    puts "hello"
  end
end

class NoHello
  include Greeting      # Greetingモジュールをインクルード
end

obj = NoHello.new
obj.hello               # => "hello"

スーパークラスのインスタンスメソッド

  • 継承元のスーパークラスで定義しているメソッド
class Super           # スーパークラス
  def hello           # スーパークラスのインスタンスメソッド
    puts "hello"
  end
end

class Sub < Super     # Superクラスを継承してサブクラスを作成
end

obj = Sub.new
obj.hello             # => "hello"

obj2 = Super.new
obj2.hello            # => "hello"

キーワード引数

  • **Hash をキーワード引数に変換する。
def foo(x:, y:, z:)
  p [x, y, z]
end

h = {x: 1, y: 2, z: 3}
foo(**h)

# => [1, 2, 3]