qiezi 发表于 2013-1-27 06:26:48

D语言的is表达式

is关键字有2种用法,可以当作===来用(===和!==操作符已经废弃了),它是全等判断,相当于java里的==,而==则和java里的equals同义。值类型(包括简单类型、结构)的全等判断和等于判断是相同的,类对象的全等判断是判断对象指针,等于判断则是调用opEquals。

测试一下:

import std.stdio;class Test{public:bool opEquals(Test other){return true;}}struct Foo{int a = 0;}void outputEquals(T1, T2)(T1 v1, T2 v2){if (v1 == v2){writefln("equal");}else{writefln("not equal");}}void outputIs(T1, T2)(T1 v1, T2 v2){if (v1 is v2){writefln("is");}else{writefln("is not");}}void main(){auto a = new Test;auto b = new Test;Foo fooa;Foo foob;outputEquals(1, 1);outputIs(1, 1);outputEquals(a, b);outputIs(a, b);outputEquals(fooa, foob);outputIs(fooa, foob);foob.a = 1;outputEquals(fooa, foob);outputIs(fooa, foob);}

is的另一个用法是is表达式,它在编译期执行,主要用来作类型判断。编译期的值相等判断用==操作符,当然要求这些值是简单值类型。is表达式作类型萃取时比较方便,在C++判断一个类型是否是一个函数实现起来很困难,在D中用is判断就好了。

详见:
http://www.digitalmars.com/d/expression.html#IsExpression

DMD 0.174中实现了type traits,其中ReturnType是这样实现的:
template ReturnType(alias dg){    alias ReturnType!(typeof(dg)) ReturnType;}template ReturnType(dg){    static if (is(dg R == return))alias R ReturnType;    elsestatic assert(0, "argument has no return type");}
这2个模板必须按这个顺序,前一个模板提取类型,后一个模板则析取类型。

这个is(dg R == return))看起来很别扭,它是判断dg这个类型是不是函数类型、函数指针类型或委托类型,如果匹配了这几个类型,则把返回值类型赋给R,否则R是未定义的。
页: [1]
查看完整版本: D语言的is表达式