Improve this page Github へのログインが必要です。 簡単な修正は、ここから fork、オンライン編集、pull request ができます。 大きな修正については、 通常の clone で行って下さい。 Page wiki 関連するWikiページを参照・編集 English このページの英語版(原文)

D1 コードの D2 への移植

D言語に対して行われた変更の中で、 D1 から D2 へとソースコードを移行する際に影響するものは多くあります。 このドキュメントは、 どのようにコードを修正すればよいかのガイドです。 言語に対する変更点の一覧は、 >D 2.0 の新機能 のページをご覧下さい。

このドキュメントはまだ不完全です。


新しい予約語

D2 には以下の予約語が追加されています: pure, nothrow, shared, immutable。 D1のコードがこれらの単語を使っていた場合は、リネームが必要です。 また、アンダースコア ( _ ) 2つで始まる変数名も、 すべてリネームが必要です。


グローバル変

グローバル変数は、デフォルトでは、スレッドローカル記憶域に保存されるようになりました。 これをグローバル領域に戻すには __gshared 記憶域クラスを指定します:

int foo = 7; // D1 のコード
__gshared int foo = 7; // D2 で同じ事をする場合

グローバル変数が暗黙に全てのスレッドで共有されるべきか、 各スレッド別の記憶領域に格納されるべきかは、 注意深く判断して下さい。


静的配列は値型

D1では、関数引数に静的配列を指定した場合、参照渡しが行われました。 つまり、その静的配列の先頭を指すポインタが、 実引数として渡されました。 これはすなわち、関数内で配列の内容に変更を加えた場合、 呼び出し側にもその変更が見えるということです。 D2 では、静的配列のコピーが実引数として渡されます。 関数内での配列内容への変更は、 別のコピーへの変更ですから、 呼び出し側には見えません。

D1と同じ意味を保った動作にするには、予約語 ref を引数宣言に追加します:

void foo(int[3] array);      // D1 のコード
void foo(ref int[3] array);  // D2 で同じ事をする場合

文字列リテラルは immutable

D1の文字列リテラルの型は char[] でしたが、 D2 では immutable(char)[] で、別名として string に alias されています。 コードの移植には、通常、ソースコード全体を検索して以下の置換を実行する必要があります:

fromto
char[]string
wchar[]wstring
dchar[]dstring

Thこれで問題の大部分は解決するでしょう。 解決しなかった部分、つまり実際に書き換え可能な文字列が必要な部分では、 いくらかの作業が必要です。