可給任何宣告(結構,類,變數)賦值屬性,然後編譯時訪問他們來改變編譯的方式.使用者定義屬性完全是編譯時特徵.
@encrypted string name;
可以指定多個屬性.這樣:
@encrypted @colored string lastname;
@(encrypted,colored) string address;
屬性名可為型別名,使用者定義值,基本型別
.禁止屬性包含像42字樣的字面量(意思不明).
struct encrypted
enum color
struct colored
void
main()
a,b的屬性不同.
這樣獲取_ _traits(getattributes)
屬性,屬性含義根據需要而定.
import std.stdio;
// ...
struct person
void
main()
}
_ _traits(allmembers)
按串取型別/模組的成員
_ _traits(getmember)
訪問成員時取乙個符號.
import std.string;
// ...
void
main()
writeln()
;}}
_ _traits(getmember, person, "name")
生成符號person.name
std.traits.hasuda
確定是否有使用者屬性.
import std.traits;
// ...
static
assert
(hasuda!
(person.name, encrypted));
//有`加密`屬性
static
assert
(hasuda!
(person.name, colored));
static
assert
(hasuda!
(person.name,
colored
(color.blue)))
;
示例:
void
printasxml
(t)(t object)
//加密
writefln
(` <
%1$s color=
"%2$s"
>
%3$s1$s>`, member,colorattributeof!
(t, member)
, value);}
//都是展開的
}
顏色屬性:
foreach (attr;
__traits
(getattributes,
__traits
(getmember, t, membername)))
}return color.black;
}
等價於:
void
printasxml_person
(person object)
}
完整程式:
import std.stdio;
import std.string;
import std.algorithm;
import std.conv;
import std.traits;
struct encrypted
enum color
//列舉
struct colored
struct person
//有顏色返回指定顏色,無,為黑色
color colorattributeof
(t, string membername)()
}return result;
}auto
encrypted
(string value)
unittest
void
printasxml
(t)(t object)
writefln
(` <
%1$s color=
"%2$s"
>
%3$s1$s>`,member, colorattributeof!
(t, member)
, value);}
}void
main()
}
使用者定義屬性可以不改變程式只改變屬性宣告.如
struct person
//都加密了
}// ...
printasxml
(person
("cindy"
,"de cannes"
,"cannes"))
;
也可同其他型別連用
struct data
// ...
printasxml
(data
("hello world"))
;
使用者定義屬性可賦值給任意型別,可為型別名或值(物件)
可通過hasuda 和 __traits(getattributes)
來改變編譯程式方式
31用d程式設計屬性合同程式設計
可以指定成員函式作為屬性名.這樣a.b,b就可能是函式,只要前面加了 屬性.length屬性不能修改靜態陣列.對切片,有可能會分配空間,甚至移動到新位置 初化新成員.因為屬性,所以呼叫函式,可以不加 struct rectangle auto garden rectangle 10 20 write...
Civil 3D 點 使用者自定義屬性刪除
qq群友提出的問題,當問點編組設定使用者自定義屬性分類並修改自定義屬性值後,想刪除自定義屬性時提示屬性正在使用,無法刪除.為實現刪除功能,使用com api,順利實現刪除。測試 如下 civil 3d版本為2022,public void c testudp tr.commit using tran...
05用d程式設計切片
切片,動態陣列的別名.起.尾 是這樣的 即左包右不包 切片不是實體,就像鑰匙一樣.如果切片修改實體,則實體也跟著變了.a.a 大小為0,a.表示陣列長度,等價於陣列.長度.dup複製實體.如下 import std.stdio void main 賦值 int 3 a 1 1,1 int 3 b 2...