forked from dlang/dlang.org
-
Notifications
You must be signed in to change notification settings - Fork 4
/
property.dd
286 lines (229 loc) · 8.62 KB
/
property.dd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
Ddoc
$(SPEC_S プロパティ,
$(P 全ての型と式は、プロパティを持っています:)
$(TABLE2 プロパティの例,
$(TR $(TH 式) $(TH 値))
$(TR $(TD int.sizeof) $(TD 4を返す))
$(TR $(TD float.nan) $(TD 浮動小数点数のNaN(Not A Number)値を返す))
$(TR $(TD (float).nan) $(TD 浮動小数点数のNaN値を返す))
$(TR $(TD (3).sizeof) $(TD 4を返す (3はintなので)))
$(TR $(TD 2.sizeof) $(TD 文法エラー。"2." までで浮動小数点数扱いになってしまうので))
$(TR $(TD int.init) $(TD int型の初期値))
$(TR $(TD int.mangleof) $(TD 文字列 "i"))
$(TR $(TD int.stringof) $(TD 文字列 "int"))
$(TR $(TD (1+2).stringof) $(TD 文字列 "1 + 2"))
)
$(BR)
$(TABLE2 全ての型の持つプロパティ,
$(TR $(TH プロパティ) $(TH 説明))
$(TR $(TD $(LINK2 #init, .init)) $(TD 初期値))
$(TR $(TD $(LINK2 #sizeof, .sizeof)) $(TD byte単位でのサイズ (Cのsizeof(type)と同等)))
$(TR $(TD $(LINK2 #alignof, .alignof)) $(TD アラインメントのサイズ))
$(TR $(TD .mangleof) $(TD 型名の'$(SINGLEQUOTE mangled)'表現文字列))
$(TR $(TD $(LINK2 #stringof, .stringof)) $(TD その型をソースコード上で表す文字列表現))
)
$(BR)
$(TABLE2 整数型のプロパティ,
$(TR $(TH プロパティ) $(TH 説明))
$(TR $(TD .init) $(TD 初期値 (0)))
$(TR $(TD .max) $(TD 最大値))
$(TR $(TD .min) $(TD 最小値))
)
$(BR)
$(TABLE2 Properties for Floating Point Types,
$(TR $(TH プロパティ) $(TH 説明))
$(TR $(TD .init) $(TD 初期値 (NaN)))
$(TR $(TD .infinity) $(TD 無限大))
$(TR $(TD .nan) $(TD NaN))
$(TR $(TD .dig) $(TD 精度の10進桁数))
$(TR $(TD .epsilon) $(TD 1.0 に対する最小の増分値))
$(TR $(TD .mant_dig) $(TD 仮数部のビット数))
$(TR $(TD .max_10_exp) $(TD 10<sup>max_10_exp</sup> が表現可能な最大の整数))
$(TR $(TD .max_exp) $(TD 2<sup>max_exp-1</sup> が表現可能な最大の整数))
$(TR $(TD .min_10_exp) $(TD 10<sup>min_10_exp</sup> が正規化数として表現可能な最小の整数))
$(TR $(TD .min_exp) $(TD 2<sup>min_exp-1</sup> が正規化数として表現可能な最小の整数))
$(TR $(TD .max) $(TD 無限大を除いた最大値))
$(V1 $(TR $(TD .min) $(TD 0を除いた最小の正規化数)))
$(V2 $(TR $(TD .min_normal) $(TD 0を除いた最小の正規化数)))
$(TR $(TD .re) $(TD 実部))
$(TR $(TD .im) $(TD 虚部))
)
$(BR)
$(TABLE2 クラス型のプロパティ,
$(TR $(TH プロパティ) $(TH 説明))
$(TR $(TD $(LINK2 #classinfo, .classinfo)) $(TD クラスの動的な型情報))
)
$(SECTION2 $(LNAME2 init, .init) プロパティ,
$(P $(B .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
----------------
)
$(SECTION2 $(LNAME2 stringof, .stringof) プロパティ,
$(P $(B .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"
}
----------------
)
$(SECTION2 $(LNAME2 sizeof, .sizeof プロパティ),
$(P $(CODE $(I e).sizeof) は式
$(I e) のバイト単位でのサイズを表します。
)
$(P メンバのサイズが欲しいときには、
$(I this) オブジェクトは不要です:
)
---
struct S {
int a;
static int foo() {
return a.sizeof; // 4を返す
}
}
void test() {
int x = S.a.sizeof; // xを4とする
}
---
$(P $(CODE .sizeof) がクラスオブジェクトに適用された場合、
インスタンスのサイズではなく、クラス参照のサイズを返します。)
)
$(SECTION2 $(LNAME2 alignof, .alignof プロパティ),
$(P $(CODE .alignof) は式や型のalignmentのサイズを返します。
例えば、1 はバイト単位で整列されることを表し、
4 は32ビット単位で整列されることを表します。
)
)
$(SECTION2 $(LNAME2 classinfo, .classinfo) プロパティ,
$(P $(CODE .classinfo)
はクラスオブジェクトの動的型情報を提供します。
$(V1 $(DPLLINK phobos/object.html, object.ClassInfo) 型のインスタンスへの参照を返します。)
$(V2 $(DPLLINK phobos/object.html#TypeInfo_Class, object.TypeInfo_Class) 型のインスタンスへの参照を返します。)
)
$(P $(CODE .classinfo) をインターフェイスに適用した場合は、
インスタンスのクラスの情報ではなく、そのインターフェイスの情報を返します。
)
)
$(SECTION3 $(LNAME2 classproperties, ユーザー定義のクラス/構造体プロパティ),
$(P プロパティとは、
構文上はあたかもフィールドであるかのように扱えるメンバ関数のことです。
プロパティは読み取りも書き込みも可能です。
引数無しのメソッド呼び出しによって読み取りが行われ、
セットされる値を引数にしたメソッド呼び出しによって書き込みが行われます。
)
$(P 簡単なプロパティの例をあげます:)
$(V1
----------------
struct Foo
{
int data() { return m_data; } // 読み取りプロパティ
int data(int value) { return m_data = value; } // 書き込みプロパティ
private:
int m_data;
}
----------------
)
$(V2
----------------
struct Foo {
@property int data() { return m_data; } // 読み取りプロパティ
@property int data(int value) { return m_data = value; } // 書き込みプロパティ
private:
int m_data;
}
----------------
$(P プロパティは $(CODE @property) 属性でマークされます。
プロパティは必ず 0 引数か 1 引数で、可変個引数にすることもできません。
プロパティ関数を非プロパティ関数とオーバーロードすることはできません。
)
)
$(P これを使うには:)
----------------
int test() {
Foo f;
f.data = 3; // f.data(3); と同じ
return f.data + 3; // return f.data() + 3; と同じ
}
----------------
$(P 読み取りメソッドが存在しなければ、そのプロパティは書き込み専用になります。
書き込みメソッドが存在しなければ、そのプロパティは読み込み専用です。
複数の書き込みメソッドがあっても構いません。
通常の関数オーバーロードの規則によって、適切なものが選択されます。
)
$(P この他の全ての点において、これらのメソッドは他のメソッドと同様に振る舞います。
static にすることも、別のリンケージを指定することも、$(V1
他の複数引数のメソッドとオーバーロードすることも、) アドレスをとることなども全て可能です。
)
$(V1
$(P $(B 注意:) プロパティは現在の所、
$(I op)=, ++, -- 演算子のlvalueとすることはできません。
)
)
$(V2
$(P $(B 注意:) プロパティは、ref を返すように定義されていれば
$(I op)=, ++, -- 演算子のlvalueとすることができます。
)
)
$(P 組み込みのプロパティである $(CODE .sizeof), $(CODE .alignof), $(CODE .mangleof)
は、構造体や共用体、クラス、列挙体のフィールドやメソッドとして宣言することはできません。
)
$(P .property がユーザー定義のプロパティに対してさらに適用された場合、その .property
は関数呼び出しの結果に対して適用されます。
)
$(V2
---
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 の値
}
---
)
)
)
Macros:
TITLE=プロパティ
WIKI=Property
CATEGORY_SPEC=$0