56用d程式設計使用者定義屬性

2021-10-03 09:17:57 字數 2930 閱讀 2147

可給任何宣告(結構,類,變數)賦值屬性,然後編譯時訪問他們來改變編譯的方式.使用者定義屬性完全是編譯時特徵.

@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...