symbol、参照、破壊的メソッド

シンボル

文字列そのものに意味はなく、単純にラベルとして文字列を扱いたいというときシンボルを使う。
シンボルのポイントは、文字の並びが同じであれば(同値であれば)同一であること。


hoge1 = :hoge1
p hoge1 # 524328
hoge2 = :hoge1
p hoge2 # 524328
hoge3 = :hoge3
p hoge3 # 324648

文字列からシンボルに変換できる。


hogeA = "hoge1".to_sym
p hogeA.object_id # 524328

値の同値性と同一性

演算子==は、例えば2つの文字列の値が等しいかどうか(同値であるか)を比較する。
一方で、2つの変数のobject_idが等しいかどうか(同一であるか)を比較するために、
equal?メソッドを利用する。


hoge_x = "hoge1"
hoge_y = "hoge1"
p hoge_x == hoge_y # true
p hoge_x.equal? hoge_y # false

オブジェクトと参照

変数を宣言すると(つまりリテラルを指定すると)オブジェクトへの参照が与えられる。
以下の場合、”hoge”という一つのオブジェクトをhoge1、hoge2が参照する形になる。


hoge1 = "hoge"
hoge2 = hoge1
hoge1.equal? hoge2 # true

片方の変数について値を変更した場合、その変更に対応するオブジェクトが新たに作られ、
新しいオブジェクトへの参照が作られる。


hoge1 = "hoge"
hoge2 = hoge1
hoge2 = hoge2 + "fuga"
p hoge1 # hoge
p hoge2 # hogefuga
hoge1.equal? hoge2 # false

実引数と仮引数の参照

関数に実引数として渡した変数と関数内で利用できる仮引数の参照は同じ。
ただし関数内で仮引数に対して処理すると、別の値が確保され、仮引数はその値への参照となる。


x = 100
x.object_id # 435123

def func x
  p x.object_id # 435123
  x = 200
  p x.object_id # 249821
end

破壊的メソッドと参照

変数の値を変更したときに参照を変えずに値を変更するメソッドを破壊的メソッドという。
慣例的に破壊的メソッドの末尾には「!」をつける。
破壊的メソッドと、代入時に別変数を確保して参照を変更するメソッドはしばしば同名で、
「!」により区別することがある。
残念ながら徹底されておらず、破壊的メソッドなのに「!」がなかったり逆もある。


w = "hogehoge"
w.chop # "hogehog"
w # "hogehoge"
w.chop! # "hogehog"
w # "hogehog"