D2.0的字符串

D2.0的字符串增加了常量,不变量和变量.在很大程度上增加了语意的清晰度.但给编程带来了更小的粒度.如同使用动态脚本语言,你不必关系类型,使用静态语言你就要严格定义.D2就更严格了:对字符串也进行严格的定义.

 

1.变量 D1.0的字符串都是变量.也就是mutable的.D2中仅仅char[] 是变量,可以运用下标进行访问每个char的变量.

 

2.不变量是invariant的.也就是不变的.一旦初始化就不可以更改.修改长度,连接,切片还是可以的.

 

3.常量是const定义的.const可以在编译时求值的.

 

从D2的文档来看,D引入不变量和常量主要为了多核并行编程.

 

4.例子1:

alias char[] mstring; // 可变的
alias const(char)[] cstring; //常量
alias invariant(char)[] istring; // 不变量
class String{
	
	/// 字符串数据
	private mstring value_;

	///参数多数都用不变量或者常量
	public this (cstring value = "")
	{
		this.value_ = value.dup;
	}
	
	///可以使用cast转换,在D1和D2兼容
	public istring value (cstring v)
	{
		return cast(istring) (this.value_ = v.dup);
	}	

	public istring value ()
	{
		return cast(istring) this.value_;
	}
	
	
	///仅使用D2可以使用idup获得一个不变量的副本	
	public istring ivalue (cstring v)
	{
		return (this.value_ = v.dup).idup; 
	}
	public istring ivalue ()
	{
		return this.value_.idup; 
	}
}

 

5.调用C的API,要使用std.string.toStringz转换const char*,char*时,可以用cstring.ptr指针,进行转换cast(char*) cstring.ptr;

 

 

6.invariant,immutable都是D2的关键字.通过试验,二者似乎没有区别.

 

7.下面代码在D2.027,XP测试通过.

 

import std.stdio;

void main()
{		
	string istr;
	istr = "abcde";
	immutable(char)[] p = cast(invariant)istr.dup;
	char[] mstr = istr.dup;
	writefln(mstr);
	istr = istr ~ istr;
	writefln(istr);
	string istr2 = istr.idup;
	istr2 = istr2 ~ istr2;
	writefln(istr2);
	istr2.length = 3;
	istr2 = istr2 ~ "ff";
	writefln(istr2);	
	string istr3 = istr2[2..4];
	istr3 ~= "gg";
	writefln(istr3);
	//istr3[3]='a'; error
	istr3= istr3[0..2]~'a'~istr3[3..$];
	writefln(istr3);
	
}

 

 

 

不当之处,希望大家指正!

你可能感兴趣的:(编程,XP,脚本,D语言)