シンボル
文字列そのものに意味はなく、単純にラベルとして文字列を扱いたいというときシンボルを使う。
シンボルのポイントは、文字の並びが同じであれば(同値であれば)同一であること。
1 2 3 4 5 6 |
hoge1 = :hoge1 p hoge1 # 524328 hoge2 = :hoge1 p hoge2 # 524328 hoge3 = :hoge3 p hoge3 # 324648 |
文字列からシンボルに変換できる。
1 2 |
hogeA = "hoge1".to_sym p hogeA.object_id # 524328 |
値の同値性と同一性
演算子==は、例えば2つの文字列の値が等しいかどうか(同値であるか)を比較する。
一方で、2つの変数のobject_idが等しいかどうか(同一であるか)を比較するために、
equal?メソッドを利用する。
1 2 3 4 |
hoge_x = "hoge1" hoge_y = "hoge1" p hoge_x == hoge_y # true p hoge_x.equal? hoge_y # false |
オブジェクトと参照
変数を宣言すると(つまりリテラルを指定すると)オブジェクトへの参照が与えられる。
以下の場合、”hoge”という一つのオブジェクトをhoge1、hoge2が参照する形になる。
1 2 3 |
hoge1 = "hoge" hoge2 = hoge1 hoge1.equal? hoge2 # true |
片方の変数について値を変更した場合、その変更に対応するオブジェクトが新たに作られ、
新しいオブジェクトへの参照が作られる。
1 2 3 4 5 6 |
hoge1 = "hoge" hoge2 = hoge1 hoge2 = hoge2 + "fuga" p hoge1 # hoge p hoge2 # hogefuga hoge1.equal? hoge2 # false |
実引数と仮引数の参照
関数に実引数として渡した変数と関数内で利用できる仮引数の参照は同じ。
ただし関数内で仮引数に対して処理すると、別の値が確保され、仮引数はその値への参照となる。
1 2 3 4 5 6 7 8 |
x = 100 x.object_id # 435123 def func x p x.object_id # 435123 x = 200 p x.object_id # 249821 end |
破壊的メソッドと参照
変数の値を変更したときに参照を変えずに値を変更するメソッドを破壊的メソッドという。
慣例的に破壊的メソッドの末尾には「!」をつける。
破壊的メソッドと、代入時に別変数を確保して参照を変更するメソッドはしばしば同名で、
「!」により区別することがある。
残念ながら徹底されておらず、破壊的メソッドなのに「!」がなかったり逆もある。
1 2 3 4 5 |
w = "hogehoge" w.chop # "hogehog" w # "hogehoge" w.chop! # "hogehog" w # "hogehog" |