開発
続・D言語のimmutableとconstの違い
mima
こんにちは。
前回の記事とは別の観点でimmutableとconstの違いを語ります。
D1時代にはimmutableが無かった!!
D1時代には、D言語にはconstしかありませんでした。
これは、普通のコードを書くときは、基本的にconstを使えばいいことを意味しています。
少し特殊な状況のために、D2でimmutableが追加されました。
非constからconstへ暗黙的にキャストされる
constは、読み取り専用という性質の他に、非constからconstへ暗黙的にキャストされるという性質を持っています。
void f(const(int)* a){} void main(){ int i; f(&i); // int* が const(int)* に暗黙的にキャストされている }
ほとんどの場合は、暗黙的にキャストされる方が便利です。
しかし、そうでない場合もあります。
関数「読み取り専用な値を渡してください・・・」
時として、「関数を呼び出す側でも読み取り専用である値」を引数としてとる関数を作りたい時があります。
そんなときに、普通にconstを使うと、
void f(const(int)* a){} void main(){ const int a; int b; f(&a); // 呼び出す側でも読み取り専用 f(&b); // 呼び出す側では書き込み可能だが呼び出せてしまう }
6行目で、呼び出す側で非constな値を渡せてしまっています。これは困ります。
主な原因は暗黙的キャストです。
暗黙的キャストの性質を持たないconstが欲しい
そう、それがimmutableです。
immutableを使うと、「関数を呼び出す側でも読み取り専用である値」を引数としてとる関数を作ることができます。
void f(immutable(int)* a){} void main(){ immutable int a; int b; f(&a); // 呼び出す側でも読み取り専用 f(&b); // コンパイルエラー!! int* から immutable(int)* へは暗黙的にキャストされない。 }
immutable便利ですね。
まとめ
使い方を見ると、immutableとconstの違いがよく分かりますね。
みなさんも、機会があればimmutableを使ってみてください。
担当:美馬(Rangeが今更Sequenceになっても、違和感しかない・・・)