rubyの基礎(4)ミュータブルとイミュータブル

破壊的メソッドと非破壊的メソッドの違いの話題の続きですが、

破壊的メソッドがあるのが「mutable(可変)オブジェクト」です。
破壊的メソッドがないのが「immutable(不変)オブジェクト」です。

これまでに出てきたオブジェクトの mutable / immutable の区別は次の通りです。

mutable・・・文字列・配列・連想配列
immutable・・整数・浮動小数点数・true・false・nil

String(文字列)、Array(配列)、Hash(連想配列)は内容が破壊的メソッドで書き換わるのでmutable(可変)オブジェクトです。

対して、整数・浮動小数点数・true・false・nilのオブジェクトは破壊的メソッドがないのでimmutable(不変)オブジェクトです。

ちなみに整数のインクリメント「i += 1 」はIntegerクラスの破壊的メソッド呼び出しではないのでご注意を。これはシンタックスシュガーで「i = i + 1 」と解釈され「=」は代入の演算子なので、i の現在の値に1が加算された値で、置き換わる(変数宣言されると言ってもいい)のです。

またrubyでは++や--でのインクリメント(1加算)・デクリメント(1減算)がありません。これは整数オブジェクトが「immutable(不変)オブジェクト」として設計されているため、++や--のように自分自身を破壊的に増減させるメソッドを持っていないからです。その代わりに、i += 1や i -= 1 を使います。

irb> i = 1
=> 1
irb> i += 1
=> 2
irb> i 
=> 2

この記事が気に入ったらサポートをしてみませんか?