プロパティ
全ての型と式は、プロパティを持っています:
式 | 値 |
---|---|
int.sizeof | 4を返す |
float.nan | 浮動小数点数のNaN(Not A Number)値を返す |
(float).nan | 浮動小数点数のNaN値を返す |
(3).sizeof | 4を返す (3はintなので) |
2.sizeof | 文法エラー。"2." までで浮動小数点数扱いになってしまうので |
int.init | int型の初期値 |
int.mangleof | 文字列 "i" |
int.stringof | 文字列 "int" |
(1+2).stringof | 文字列 "1 + 2" |
プロパティ | 説明 |
---|---|
.init | 初期値 |
.sizeof | byte単位でのサイズ (Cのsizeof(type)と同等) |
.alignof | アラインメントのサイズ |
.mangleof | 型名の'‘mangled’'表現文字列 |
.stringof | その型をソースコード上で表す文字列表現 |
プロパティ | 説明 |
---|---|
.init | 初期値 (0) |
.max | 最大値 |
.min | 最小値 |
プロパティ | 説明 |
---|---|
.init | 初期値 (NaN) |
.infinity | 無限大 |
.nan | NaN |
.dig | 精度の10進桁数 |
.epsilon | 1.0 に対する最小の増分値 |
.mant_dig | 仮数部のビット数 |
.max_10_exp | 10max_10_exp が表現可能な最大の整数 |
.max_exp | 2max_exp-1 が表現可能な最大の整数 |
.min_10_exp | 10min_10_exp が正規化数として表現可能な最小の整数 |
.min_exp | 2min_exp-1 が正規化数として表現可能な最小の整数 |
.max | 無限大を除いた最大値 |
.min_normal | 0を除いた最小の正規化数 |
.re | 実部 |
.im | 虚部 |
プロパティ | 説明 |
---|---|
.classinfo | クラスの動的な型情報 |
.init プロパティ
.initはデフォルト初期化値を表す定数式です。 型に適用されればその型の初期値となり、 変数やフィールドに適用されれば、 その変数/フィールドを初期化した値となります。 例:
int a;
int b = 1;
typedef int t = 2;
t c;
t d = cast(t)3;
int.init // 0
a.init // 0
b.init // 0
t.init // 2
c.init // 2
d.init // 2
struct Foo {
int a;
int b = 7;
}
Foo.init.a // 0
Foo.init.b // 7
.stringof プロパティ
.stringof プロパティは、 その対象要素のソースコード上で文字列表現を返します。 型に適用された場合、その型を表す文字列になります。 式に適用された場合、 その式のソースコード上での表現文字列になります。 式に対しては意味解析は行われません。 例:
module test;
import std.stdio;
struct Foo { }
enum Enum { RED }
typedef int myint;
void main() {
writeln((1+2).stringof); // "1 + 2"
writeln(Foo.stringof); // "Foo"
writeln(test.Foo.stringof); // "Foo"
writeln(int.stringof); // "int"
writeln((int*[5][]).stringof); // "int*[5u][]"
writeln(Enum.RED.stringof); // "cast(enum)0"
writeln(test.myint.stringof); // "myint"
writeln((5).stringof); // "5"
}
.sizeof プロパティ
e.sizeof は式 e のバイト単位でのサイズを表します。
メンバのサイズが欲しいときには、 this オブジェクトは不要です:
struct S {
int a;
static int foo() {
return a.sizeof; // 4を返す
}
}
void test() {
int x = S.a.sizeof; // xを4とする
}
.sizeof がクラスオブジェクトに適用された場合、 インスタンスのサイズではなく、クラス参照のサイズを返します。
.alignof プロパティ
.alignof は式や型のalignmentのサイズを返します。 例えば、1 はバイト単位で整列されることを表し、 4 は32ビット単位で整列されることを表します。
.classinfo プロパティ
.classinfo はクラスオブジェクトの動的型情報を提供します。 object.TypeInfo_Class 型のインスタンスへの参照を返します。
.classinfo をインターフェイスに適用した場合は、 インスタンスのクラスの情報ではなく、そのインターフェイスの情報を返します。
ユーザー定義のクラス/構造体プロパティ
プロパティとは、 構文上はあたかもフィールドであるかのように扱えるメンバ関数のことです。 プロパティは読み取りも書き込みも可能です。 引数無しのメソッド呼び出しによって読み取りが行われ、 セットされる値を引数にしたメソッド呼び出しによって書き込みが行われます。
簡単なプロパティの例をあげます:
struct Foo {
@property int data() { return m_data; } // 読み取りプロパティ
@property int data(int value) { return m_data = value; } // 書き込みプロパティ
private:
int m_data;
}
プロパティは @property 属性でマークされます。 プロパティは必ず 0 引数か 1 引数で、可変個引数にすることもできません。 プロパティ関数を非プロパティ関数とオーバーロードすることはできません。
これを使うには:
int test() {
Foo f;
f.data = 3; // f.data(3); と同じ
return f.data + 3; // return f.data() + 3; と同じ
}
読み取りメソッドが存在しなければ、そのプロパティは書き込み専用になります。 書き込みメソッドが存在しなければ、そのプロパティは読み込み専用です。 複数の書き込みメソッドがあっても構いません。 通常の関数オーバーロードの規則によって、適切なものが選択されます。
この他の全ての点において、これらのメソッドは他のメソッドと同様に振る舞います。 static にすることも、別のリンケージを指定することも、 アドレスをとることなども全て可能です。
注意: プロパティは、ref を返すように定義されていれば op=, ++, -- 演算子のlvalueとすることができます。
組み込みのプロパティである .sizeof, .alignof, .mangleof は、構造体や共用体、クラス、列挙体のフィールドやメソッドとして宣言することはできません。
.property がユーザー定義のプロパティに対してさらに適用された場合、その .property は関数呼び出しの結果に対して適用されます。
void main() {
@property int[] delegate() bar1 = { return [1, 2]; };
auto x1 = bar1.ptr; // 配列データを指す
struct Foo { int* ptr; }
@property Foo delegate() bar2 = { return Foo(); };
auto x2 = bar2.ptr; // Foo.ptr の値
}