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); }
不当之处,希望大家指正!