読者です 読者をやめる 読者になる 読者になる

【D言語】UDAが登場!!使い方を探ってみる!!

D言語

D言語erの皆さん、こんにちは。 今回は、最近になって、なぜかウォルたんによって実装された新たな機能である、UDAの使い方について少し書いていきます。

UDAとは?


User Defined Attributesの略です。 シンボルにいろいろな情報を付け加えることができます。 詳しくは、ここを参照してください。 現在は、dmdのgitリポジトリのheadをビルドしたり、DPasteを使うことによって、UDAを試すことができます。

Serializable


型がシリアライズ可能であることの保証を、UDAで表現できます。


import std.typetuple;

template isSerializable(T){ enum isSerializable = staticIndexOf!("Serializable", __traits(getAttributes, T)) != -1; }


class A{}


class B{}

pragma(msg, isSerializable!A); // true pragma(msg, isSerializable!B); // false

void main(){}

std.typetuple.staticIndexOfを使って、UDAに"Serializable"が含まれているか判定しています。 しかし、std.typetuple.staticIndexOfなのに、ExpressionTupleの検索ができるとは、これ如何に・・・

CTFEable


同じく、関数がCTFEableであることの保証も、UDAで表現できます。

import std.typetuple, std.traits;

ReturnType!func safeCall(alias func)(ParameterTypeTuple!func args){ if(ctfe){ static if(staticIndexOf!("CTFEable", traits(getAttributes, func)) != -1){ return func(args); }else{ assert(0, "unsafe function call"); } }else{ return func(args); } }

 int add(int a, int b){ return a + b; }

 int mul(int a, int b){ return a * b; }

pragma(msg, safeCall!add(2, 3)); // 5; pragma(msg, safeCall!mul(2, 3)); // Error: "unsafe function call"

UDAとして"CTFEable"を含んでいる時のみ関数を呼んでいます。

まとめ


UDAは、つい先日実装されたばかりです。 色々と考えて見ましたが、自分はあまり他言語に詳しくないので、思いついた使い方はこのくらいでした。 これの使い方を見ると、UDAはあまり役に立ちそうには見えませんが、 他の言語での使われ方などを参考に、これからいろんな使い方が見つかると思います。 楽しみですね。

担当:美馬(機能追加なんて何ヶ月ぶりだろう・・・)