Vol.3 ~メソッド~
○ オブジェクト
Ruby は純粋なオブジェクト指向言語で、「全てのデータ」がオブジェクトとして表現される。
文字列 「 "hello, world" 」 もオブジェクト。
○ メソッド
オブジェクトを操作する記述をメソッドという。
メソッドの呼び出しは オブジェクト.メソッド(引数) という形で記述する
オブジェクトIDを表示する
>> "hello,world".object_id
=> 24369870
オブジェクトを大文字にする
>> "hello,world".reverse
=> "dlrow,olleh"
オブジェクトを反転する
>> "hello,world".upcase
=> "HELLO,WORLD"
○ シンタックスシュガー(糖衣構文)
オブジェクトへの操作(メソッド)をより簡易に記述する方法をシンタックスシュガーという。
例) 演算子 「+(プラス)」
メソッド呼び出しの書き方 (オブジェクト「1」のプラスメソッドを引数「1」で呼び出す)
>> 1.+(1)
=> 2
シンタックスシュガー (通常の算術演算子のような書き方)
>> 1 + 1
=> 2
○ メソッドの定義
オブジェクトに備わった既存のメソッド以外に、任意のメソッドを定義することも可能。
定義する方法は以下のように記述する。
def 変数.メソッド名(仮引数)
# 処理内容
end
例) 変数 hello にメソッド japanese を追加する。処理内容は Hello.Japaneseという文字列を返す。
>> def hello.japanese
>> "Hello,Japanese"
>> end
Rubyでは、最後に記述した式の評価地が戻り値になる。
戻り値を明示的に指定したい場合は、「return」 キーワードを使用する
実用例)
>> hello = "hello,world" # オブジェクト hello に文字列 "hello,world" を代入
=> "hello,world"
>> puts hello # オブジェクト hello の内容を表示する
hello,world
=> nil
>> def hello.japan # オブジェクト hello にメソッド japan を追加する
>> return "Hello,Japan" # returnの有無は同意
>> end
=> nil
>> hello.japan # オブジェクト hello の japan メソッドを呼び出す
=> "Hello,Japan"
特定のオブジェクトにのみ定義されたメソッドを 「特異メソッド(singleton method)」 という。
特異メソッドの確認には、メソッド「singleton_methods」を呼び出す。
>> hello.singleton_methods
=> ["japan"]
>> hello2.singleton_methods
=> []
○ 関数をメソッドのように
オブジェクトを指す変数を省略してトップレベルでメソッドを定義した場合、暗黙的なオブジェクト「main」のメソッドとして定義される。
このように、トップレベルで定義したメソッドは関数のように、どこからでも呼び出すことができる。
>> def print_hello
>> puts "Hello,Japan"
>> end
○ クラスとインスタンス
クラス : (標準で用意されている)オブジェクトの雛形
インスタンス : クラスを元に生成されたインスタンス
例) 文字列 hello は String クラスのインスタンス (文字列は全てStringクラスのインスタンス)
>> hello = "hello,world"
=> "hello,world"
>> hello.class
=> String
クラスにメソッドを追加することで、各オブジェクトから呼び出せるメソッドができる
>> class String
>> def italian
>> "ciao,mondo"
>> end
>> end
=> nil
>> hello.italian
=> "ciao,mondo"
>> hello2.italian
=> "ciao,mondo"
このように、後から再定義できるクラスを「オープンクラス」という。
Ruby の標準クラスは全てオープンクラス。
○ 継承
あるクラスの定義を引きついで、新しいクラスを定義する。
オープンされていないクラスにメソッドを追加したい場合などに使用する。
class サブクラス < スーパークラス
# 定義内容
end
例) オープンされていないクラス String の定義を引き継いだサブクラス MyStringu を定義する
>> class MyString < String
>> def italian
>> "ciao,mondo"
>> end
>> end
=> nil
>> hello = MyString.new("Hello,World")
=> "Hello,World"
>> hello.italian
=> "ciao,mondo"