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

プロパティ

全ての型と式は、プロパティを持っています:

プロパティの例
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 最小値

Properties for Floating Point Types
プロパティ 説明
.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 の値
}