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);
}
不当之处,希望大家指正!
本文详细介绍了D2语言中字符串的变量、不变量和常量特性,并提供了代码示例,展示了如何在多核并行编程中利用这些特性。
1万+

被折叠的 条评论
为什么被折叠?



