`
qiezi
  • 浏览: 499788 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

D语言的is表达式

    博客分类:
  • D
阅读更多
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;
    else
	static assert(0, "argument has no return type");
}

这2个模板必须按这个顺序,前一个模板提取类型,后一个模板则析取类型。

这个is(dg R == return))看起来很别扭,它是判断dg这个类型是不是函数类型、函数指针类型或委托类型,如果匹配了这几个类型,则把返回值类型赋给R,否则R是未定义的。
分享到:
评论

相关推荐

    正则表达式学习资料整理

    在实际应用中,正则表达式通常与编程语言结合使用,例如JavaScript、Python等,通过内置的正则函数进行匹配、查找、替换等操作。例如,在JavaScript中,我们可以使用`match()`函数来检测字符串是否符合特定的正则...

    常用java正则表达式

    多种编程语言,包括Perl、PHP、Python、JavaScript以及Java等均内置了对正则表达式的支持。本文将详细介绍Java中正则表达式的使用方法,并通过Jakarta-ORO库来演示具体的实现过程。 #### 二、正则表达式基础知识 #...

    正则表达式.txt,正则表达式.txt

    在编程语言中,几乎所有现代语言都支持正则表达式的使用,例如 Java、Python、JavaScript 等。此外,在日常工作中使用的工具如 grep、sed 和 awk 等也支持正则表达式的操作。 #### 三、基本概念介绍 1. **元字符**...

    java正则表达式详解

    正则表达式是一种强大的文本处理工具,被广泛应用于各种编程语言中,用于文本的查找与替换、验证等场景。Java作为一种主流的编程语言,同样支持正则表达式的使用。 ##### 1.1 句点符号(`.`) 句点符号`.`代表任意...

    Python正则表达式基础

    Python正则表达式是Python编程语言中的一个强大工具,用于处理和分析文本字符串。它允许开发者通过模式匹配来查找、替换或提取数据,广泛应用于数据清洗、文本挖掘、日志分析等领域。在Python中,正则表达式主要通过...

    java正则表达式验证IP地址

    正则表达式的语法是`(2[5][0-5]|2[0-4]\d|1\d{2}|\d{1,2})\.(25[0-5]|2[0-4]\d|1\d{2}|\d{1,2})\.(25[0-5]|2[0-4]\d|1\d{2}|\d{1,2})\.(25[0-5]|2[0-4]\d|1\d{2}|\d{1,2})`,它可以匹配标准的IP地址。 在main方法中...

    校验时间的正则表达式

    年份部分使用了 `(1[6-9]|[2-9]\d)\d{2}` 这样的表达式,其含义是: - `1[6-9]`:匹配16到19之间的数字。 - `[2-9]\d`:匹配20至99之间的数字。 - `\d{2}`:匹配任意两位数字。 - 综合起来,这部分可以匹配从1600年...

    JS的正则表达式

    正则表达式(Regular Expression)是一种强大的文本处理工具,在多种编程语言中都有应用,包括JavaScript。它通过一种描述性的语言来匹配字符串模式,用于字符串搜索、替换等操作。 #### 二、JavaScript中正则...

    java_zhengze.rar_正则表达式_正则表达式 java

    正则表达式是编程语言中用于模式匹配和字符串处理的强大工具,在Java中也不例外。Java的正则表达式功能强大,可以用于验证输入、提取信息、替换文本等多种场景。本资料"java_zhengze.rar"提供了对Java正则表达式的...

    正则表达式学习课件PPT

    本课件“正则表达式学习课件PPT”旨在为初学者提供一个基础的正则表达式学习平台,特别地,通过使用C#语言来演示其应用。 首先,我们需要理解正则表达式的基础语法。正则表达式由一系列特殊字符和普通字符组成,...

    正则表达式简明教程及正则表达式语言元素

    ### 正则表达式简明教程及正则表达式语言元素 #### 概述 正则表达式(Regular Expressions,简称regex或regexp)是一种强大的工具,用于在文本中进行模式匹配、查找、替换和编辑操作。它已经成为编程语言中不可或...

    使用正则表达式验证小写字母

    如果你还希望允许字符串以数字开头或结尾,可以使用`"^\d*[a-z]*\d*$"`这样的正则表达式。 在实际应用中,正则表达式不仅可以用来验证小写字母,还可以处理各种复杂的文本匹配任务,如邮箱格式验证、电话号码格式...

    c#的中缀表达式转化为逆波兰式(后缀表达式)

    本文将详细介绍如何使用C#语言将中缀表达式转换为后缀表达式,并解释其背后的算法。 首先,我们需要理解中缀表达式到后缀表达式的转换过程。这个过程主要基于两个数据结构:一个字符数组或字符串表示输入的中缀...

    C#字符串和正则表达式参考手册

    在编程领域,C#语言以其强大的功能和易用性深受开发者喜爱。特别是在处理文本操作时,字符串和正则表达式是两个至关重要的概念。本文将深入探讨C#中的字符串操作和正则表达式使用,帮助你更好地理解和运用这些工具。...

    简单易懂的正则表达式教程

    正则表达式是一种强大的文本处理工具,它使用特殊的字符组合来定义模式,用于匹配、查找、替换或...正则表达式在数据处理、文本分析以及各种脚本语言中都有广泛的应用,熟练掌握正则表达式将极大地提高你的工作效率。

    几种类型的正则表达式

    正则表达式是编程语言中用于模式匹配和字符串处理的强大工具。它们被广泛应用于验证用户输入、数据提取、文本分析等多个领域。以下是一些常见类型的正则表达式及其用途: 1. **数字验证**: - `isDigit(s)` 函数...

    正则表达式判断手机号码

    正则表达式是一种强大的文本处理工具,用于匹配、查找、替换等操作,广泛应用于编程语言中,包括在iOS开发中。在iOS应用中,我们经常需要验证用户输入的数据,例如手机号码,确保它们符合特定的格式,从而提高数据的...

Global site tag (gtag.js) - Google Analytics