考虑普通局部变量:
int foo = 0;
可分析为:
Type_Name Local_Name Operator Initial_Value
考虑is表达式:
is(typeof(func) Params == __parameters)
这样:
is(Type_Name Local_Name Deconstruction_Pattern)
//后2都是可选的.
类型 | 意思 |
|---|---|
is(Type) | 有类型,但省略了本地名称和解构模式.它只关心类型是否存在. |
is(Type:something) | 用:表明可转为该类型的析构模式. |
is(Type==something) | 精确匹配,最易记 |
is(Type Identifier) | 必须存在某种类型,像整 a一样,名字在型后.跳过析构类型 |
is(Type Identifier:something) | 与前:一样,但可可选本地名 |
is(Type Identifier==something) | 同样 |
文档中还有其他,class等,大多很简单,可初化标识符为其他.看起来,is(A B == C)像B与C在比较,但这是在声明变量.
== C整个为析构模式,B为变量.类型整 a=10.
is(MyClass Parents == super)
==super,其为基类.因此把==当作匹配析构模式.更有意义.
static if(is(int[10] == T[N], T, size_t N))
只是,扩展了析构模式.==精确比较,T[N]为声明模型.问题是多数时候编译器不会告诉你模式格式不正确,只是不匹配.因而通过静态断言等来测试.
这样用,可选复杂名:
static if(is(int[10] OriginalType == T[N], T, size_t N))
知道如何分解的时候,就容易搞懂了.