メソッド
メソッドの優先順位
同じ名前の変数とメソッドがある場合は変数の方が優先される。
foo = "hi"
def foo(msg = "hello")
puts msg
end
foo # => "hi" / 変数が呼び出される
foo() # => "hello" / メソッドが呼び出される
foo "bye" # => "bye" / メソッドが呼び出される
foo foo # => "hi" / メソッドの引数に変数 "hi" を与えて呼び出される
また、obj
というオブジェクトがあり、obj.m
というメソッド呼び出しがあった場合、以下の優先順位でメソッドを探索する。
obj
の特異メソッドobj
のクラスのm
というインスタンスメソッドobj
のクラスがインクルードしているモジュールのインスタンスメソッド(include
された順とは逆順でモジュールを探索する)- スーパークラスのインスタンスメソッド
- スーパークラスがインクルードしているモジュールのインスタンスメソッド
- 見つからない場合、
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
をキーワード引数に変換する。