オブジェクトとメソッド

ボツにした下書き。

オブジェクトとメソッド

オブジェクトはいくつかのメソッドを持っています。たとえば文字列オブジェクトはupcaseというメソッドを持っています。文字列オブジェクトのupcaseメソッドを呼び出すには次のようにします。

"abc".upcase

upcaseメソッドは文字列中のアルファベット小文字をすべて大文字に変換した文字列を返します。upcaseが返す値はpメソッドを使って確認することができます。

p "abc".upcase    #=> "ABC"

このように"abc"という文字列が"ABC"になって表示されます。

オブジェクトが持つメソッドを呼び出すときはオブジェクトの後に「.」を書き、その直後にメソッド名を書きます。

オブジェクト.メソッド

上記のようにメソッドを呼び出す場合、もととなるオブジェクトをレシーバといいます。ここでいうレシーバとはメソッドというメッセージを受け取るものという意味です。

非破壊的なメソッド

文字列オブジェクトはreverseというメソッド持っています。文字列オブジェクトが持つreverseメソッドは、前後をひっくり返した文字列を返します。

a = "abc"
p a.upcase     #=> "ABC"
p a.reverse    #=> "cba"
p a            #=> "abc"

ここで注意してほしいことがあります。変数aには文字列"abc"が代入されていますが、その文字列に対してupcaseやreverseを実行しても変数aの内容は"abc"のままです。upcaseメソッドはレシーバを大文字にした文字列を返しますが、レシーバ自体を書き換えることはありません。同様にreverseメソッドもレシーバの内容を変更しません。このようにレシーバの値を変更しないメソッドを非破壊的メソッドといいます。

破壊的なメソッド

レシーバの値を書き換えるメソッドも存在します。このようなメソッドは破壊的メソッドと呼ばれます。

upcase!メソッドはレシーバを大文字に変更する破壊的なメソッドです。次の例を見てください。

a = "abc"
a.upcase!
p a   #=> "ABC"

変数aに文字列"abc"を代入し、update!メソッドを実行しています。update!メソッドを実行した後、変数aの中を見ると"ABC"に変化しています。

reverseメソッドは非破壊的なメソッドですが、破壊的に動作するreverse!メソッドも用意されています。

a = "abc"
a.reverse!
p a   #=> "cba"

このようにメソッドには非破壊的なものと破壊的なものがあります。upcaseメソッドとupdate!メソッドのように、非破壊的/破壊的の2種類のメソッドが存在する場合は、破壊的なメソッドのメソッド名の末尾に「!」が付けられています。

メソッド名に「!」がついていなくても破壊的な動作をするメソッドも存在します。次の例を見てください。

a = "aaa"
a.insert(2, "bbb")
p a    #=> "aabbbaa"

insertメソッドは第1引数で与えた数値の位置に第2引数で与えた文字列を挿入します。上の例では2文字目の直後に"bbb"という文字列を挿入します。insertメソッドは破壊的なメソッドなのでレシーバの内容を直接書き換えます。

!!数値と文字列が持つメソッド

todo

  • to_iとto_s だけにとどめよう
  • ただし文字列操作は実践編か
  • リファレンスでメソッドについて調べる