Dをつつく7-変数And定数と型推論。永遠に変らないものってあるのかな?
じゃあ、早速プログラミングをしよう!
//variable.dファイルに記述
import std.stdio;
class Foo
{
public:
invariant int MagicNumber = 42;
invariant int error = -1;
const int ID;
this( int id ) {
this.ID = id;
error = 10;
}
}
int main( char[][] ) {
auto foo = new Foo( 10 );
foo.ID = 10;
foo.MagicNumber = 1000;
return 0;
}
dmd variable.d
どう?エラーが出るでしょ?これでいいんだ。敢えて間違う事も楽習には大事ピヨ。
エラーメッセージは大体こんなんだよね
variableSample.d(12): variable variableSample.Foo.error cannot modify invariant
variableSample.d(18): Error: can only initialize const member ID inside constructor
variableSample.d(6): Error: foo.MagicNumber is not mutable
variableSample.d(19): Error: constant foo.MagicNumber is not an lvalue
このエラーメッセージが多くの事が分るピヨ。
まずは知っている人が多いと思うconst 属性(D言語では属性と呼ぶ)に関連するエラーを読むピヨ。 エラーを読むと指定したフィールドや変数は、 コンストラクタか宣言部でしか初期化出来ない 事が分るピヨ。これについては予想が出来た人が多かったと思う。
もうむずむずしていている人がいると思うけど、次はお待たせ invariant属性に関連するエラーを読もう。 エラーを読んで分るのは、この属性を指定したフィールドや変数は 絶対に変更出来ない 事ピヨ。const属性との違いは、コンストラクタ内ですら駄目 だということなんだ。厳格ピヨね。 C言語ではconstがポインタを通したら変更できたりして色々な混乱を生んだから、 D言語の設計者はこの属性を作ったんだろうね。この属性使えるピヨね。
これでお終いだと思った人もいると思うけど、実はまだ楽習するところがあるピヨ。 どこがポイントか分ったかな?
実はこの部分が新しいんだ。
auto foo = new Foo( 10 );
此処を良く見て。型が指定されていないよね。
これはauto属性と言うんだ。
この属性は、LL言語なんかに使用されている要素で、
型を推論する機能なんだ。
たった4文字で長い型名を省略できるのは便利だよね。
あれぇ?Fooだと3文字だから1文字増えているじゃん!おっほん。その辺は置いといて話を前に進めるよ。
この属性は便利だけど、多用するとコードの可読性が低下してエラーの元になりがち だから注意してね。
今度はお終い。疑わないで。もう本当に終わるよ。