英語版
このページの英語版を見る

プロパティ

すべてのシンボル、型、式には問い合わせ可能なプロパティがある。

すべての型のプロパティ
PropertyDescription
.init 初期化子
.sizeofサイズ(バイト単位
.alignof整列サイズ
.mangleof"型"の文字列による「文字化け」表現
.stringof型のソース表現を表す文字列
Expression Value
int.sizeof4を返す
(3).sizeof4 を返す (3 は int であるため)
int.init 0を返す
int.mangleof 文字列「i」を返す
int.stringof 文字列「int」を返す
(1+2).stringof 文字列「1 + 2」を返す

整数型用のプロパティ
PropertyDescription
.max最大値
.min最小値

浮動小数点型用のプロパティ
PropertyDescription
.infinity無限大の値
.nanNaN -Not a Number値 (他の NaN 値も生成可能)
.dig小数桁の精度の数
.epsilon値1への最小増分
.mant_dig仮数部のビット数
.max_10_exp10が表現可能な最大整数値max_10_exp表現できる
.max_exp2が表現できる最大整数値max_exp-1表現できる
.min_10_exp10がmin_10_exp正規化された値として表現できる最小のint値
.min_exp最小のint値で、2がmin_exp-1正規化された値として表現できる最小の整数値
.max無限大ではない最大の表現可能な値
.min_normal最小の表現可能な正規化値で、かつ0ではないもの
.re実数部
.im虚数部
浮動小数点数の例
Expression Value
float.nan浮動小数点NaN値を生成する
(2.5F).nan 浮動小数点NaN値を生成する

参照:

.initプロパティは

.init デフォルト初期化子である定数式を生成する。 型に適用された場合、その型に対するデフォルト初期化子となる。 変数またはフィールドに適用された場合、その 変数またはフィールドの型に対するデフォルト初期化子となる。 異なる種類の型のデフォルト値については、以下で説明する。

Type.init Value
char'\xff'
dchar'\xffff'
wchar'\xffff'
列挙型最初のメンバー値
整数0
浮動小数点数NaN
参照型null
構造体各フィールドのデフォルト値
共用体最初のメンバ値
Rationale: 可能な場合、型のデフォルト値は無効な値となる。
int a;
int b = 1;

static assert(int.init == 0);
static assert(a.init == 0);
static assert(b.init == 0);

struct Foo
{
    int a;
    int b = 7;
}

static assert(Foo.init.a == 0);
static assert(Foo.init.b == 7);

.init はデフォルトで初期化されたオブジェクトを生成し、デフォルトで構築されたオブジェクトではないことに注意すること。 オブジェクトにデフォルトのコンストラクタがある場合、 異なる値が生成される可能性がある。

  1. T がネストされた構造体である場合、T.init内のコンテキストポインタは null となる。
  2. void main()
    {
        int x;
        struct S
        {
            void foo() { x = 1; }  // コンテキスト・ポインタを介して、囲みスコープ内のxにアクセスする
        }
        S s1;           // OK、S()はコンテキスト・ポインタを正しく初期化する。
        S s2 = S();     // OK、s1と同じである
        S s3 = S.init;  // Bad. s3のコンテキスト・ポインタはnullである
        s3.foo();       // アクセス違反
    }
    
  3. T@disable this(); を持つ構造体である場合、T.initは 論理的に不正なオブジェクトを返す可能性がある。
  4. struct S
    {
        int x;
        @disable this();
        this(int n) { x = n; }
        invariant { assert(x > 0); }
        void check() {}
    }
    
    void main()
    {
      //S s1;           // エラー: 変数s1のイニシャライザはS型に必要である
      //S s2 = S();     //エラー: コンストラクタS.thisは呼び出せない
                        // アノテーションが@disableであるためである
        S s3 = S.init;  // Bad. s3.x == 0であり、Sの不変量に違反する
        s3.check();     // アサーション失敗
    }
    

.stringof プロパティは

.stringof 定数文字列を生成し、 そのプレフィックスのソース表現となる。 型に適用された場合、その型の文字列となる。 式に適用された場合、その式のソース表現となる。 式は評価されない。

module test;
import std.stdio;

struct Dog { }

enum Color { Red }

int i = 4;

void main()
{
    writeln((1+2).stringof);       // "1 + 2"
    writeln(Dog.stringof);         // "Dog"
    writeln(test.Dog.stringof);    // "Dog"
    writeln(int.stringof);         // "int"
    writeln((int*[5][]).stringof); // "int*[5][]"
    writeln(Color.Red.stringof);   // "Red"
    writeln((5).stringof);         // "5"

    writeln((++i).stringof);       // "i += 1"
    writeln(i);                    // 4
}
Implementation Defined: 型または式の文字列表現は 異なる場合がある。
Best Practices: コード生成には を使用しないこと。 代わりに .stringof 識別子トレイト、 またはPhobosヘルパー関数(例えば、)の1つを使用すること。 std.traits.fullyQualifiedName

.sizeof プロパティ

e.sizeof 式のバイト単位のサイズを返す 。 e

メンバのサイズを取得する際には、 このオブジェクトが存在している必要はない。

struct S
{
    int a;
    static int foo()
    {
        return a.sizeof; // 4を返却する
    }
}

void test()
{
    int x = S.a.sizeof; // xを4に設定する
}

.sizeof クラスオブジェクトに適用された場合、 クラス参照のサイズが返され、クラスインスタンスのサイズは返されない。

.alignof プロパティは

.alignof 式または型の整列サイズを返す。 たとえば、整列サイズが1の場合はバイト境界で整列されていることを意味し、 4の場合は32ビット境界で整列されていることを意味する。

Implementation Defined: 実際の整列サイズ。
Best Practices: 特に、外部から指定されたレイアウトに合わせなければならないオブジェクトをレイアウトする際には注意が必要である。 データの不整合は、特に深刻なバグの原因となる可能性がある。 を挿入して、それが正しいことを確認する価値がある場合が多い。assert

.mangleof プロパティ

文字化けとは、生成されたオブジェクトファイルでシンボルがテキスト形式でどのように表現されるかを指す。.mangleof は、 適用された型またはシンボルの表現の文字列リテラルを返す。 Dリンクの型とシンボルの文字化けは、 名前の文字化けで定義されている。

Implementation Defined:
  1. シンボルに先頭のアンダースコアが追加されるかどうか
  2. 非Dリンク時における型およびシンボルのマングリング。 CおよびC++リンク時では、これは通常、 関連するCまたはC++コンパイラの動作と一致する。
.classinfo プロパティ

.classinfo プロパティは

.classinfo クラスオブジェクトの動的型に関する情報を提供します。 型への参照を返します。 object.TypeInfo_Class

.classinfo インターフェースに適用されたものは、 インターフェースに関する情報を提供し、それがインスタンスである可能性のあるクラスに関するものではない。

ユーザー定義プロパティ

ユーザー定義のプロパティは、プロパティ関数を使用して作成できる。