Eyes, JAPAN Blog > 続・D言語のimmutableとconstの違い

続・D言語のimmutableとconstの違い

mima

この記事は1年以上前に書かれたもので、内容が古い可能性がありますのでご注意ください。

こんにちは。

前回の記事とは別の観点で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になっても、違和感しかない・・・)

Comments are closed.