3

如何检查变量是否存在,即是否已在D中声明?如何检查变量是否在D中声明?

背景是,我想使用的版本情况,但仍然有一个默认值:

version(A) 
{ 
    immutable int var = 1; 
} 
version(B) 
{ 
    immutable int var = 2; 
} 
// this is pseudo code 
if (var is not yet declared) 
{ 
    immutable int var = 3; 
} 

我只是认为这是可能的d,因为它有这么多的反省......

回答

10

那么,考虑到你的用例看起来是什么,你就会错误地解决它。你真的应该做些更喜欢

version(A) 
{ 
    immutable int var = 1; 
} 
else version(B) 
{ 
    immutable int var = 2; 
} 
else 
{ 
    immutable int var = 3; 
} 

但在一般情况下,如果你正在寻找专门测试符号是否存在,使用is(typeof(symbol))其中symbol是你用于测试符号的名称。所以,如果你想测试变量var是否存在,你会做这样的事情

static if(is(typeof(var))) 
{ 
    //var exists 
} 

,当然,以测试它不存在,你只是否定条件:

static if(!is(typeof(var))) 
{ 
    //var does not exist 
} 

typeof(exp)获取表达式的类型,如果表达式无效(由于变量不存在或表达式中的某个函数不适用于这些参数或其他),则结果为voidis(type)检查类型是否为非void。因此,is(typeof(exp))测试exp是否是一个有效的表达式,并且在它只是一个符号名称的情况下,这意味着它正在测试它是否是有效的符号。

+0

第一个是我所需要的。我不知道'version'与'if else'类型的语法一起工作。感谢您的解决方案。至于第二个“解决方案”:我尝试了'typeof',但没有'()',所以我得到一个编译器错误。我学到了两倍于我的预期;) – steffen 2013-02-09 13:31:13

+0

还有'__traits(compiles,foo)',这也可以...... – vines 2013-03-12 22:12:17