题
这可能听起来很笨。但我有与d编程语言一个奇怪的问题。当试图创建一个新的数组是这样的:
import std.stdio;
void main()
{
char[] variable = "value";
writefln(variable);
}
在DMD编译器总是给我此错误:
test.d(5):错误:不能隐式 转换型的表达(“值”) 不变(炭[5U])到char []
任何想法,为什么?我使用2.014α(可用 rel="nofollow noreferrer">)为Ubuntu。
解决方案
我被围绕导的阵列部分搜索,这可以帮助:
字符串是字符数组。字符串字面只是写字符数组的简单方法。字符串文字是不可变的(只读)。 的
char[] str1 = "abc"; // error, "abc" is not mutable
char[] str2 = "abc".dup; // ok, make mutable copy
invariant(char)[] str3 = "abc"; // ok
invariant(char)[] str4 = str1; // error, str4 is not mutable
invariant(char)[] str5 = str1.idup; // ok, make invariant copy
其他提示
基本上,它归结为是字符串常量存储在一个只读存储器部分。 char[]
是“的可变字符的可变数组” ,这将,如果写入,产生一个运行时崩溃。
因此,编译器真的想在这里保护你。
invariant(char)[]
装置的 “的不变的字符的可变数组”,这是它是什么。
PS :当你没有的需要的它是一个char[]
,你可能想使用auto
,如,auto variable = "value"
。让您摆脱思考它的类型:)
使用汽车,不用担心的类型是什么:
auto s = "some text";
让有关类型编译器担心。
有所述d语言的两个主要的版本。它们是,一般来说,彼此互不兼容,尽管代码的可以被写入在两个进行编译。
D1是你提供的代码似乎写的。它没有一成不变的阵列的概念,因此这个工作。
D2是你想怎么编译为,因此2开始编译器的版本号。其中一个主要的特定D2-特征是常量和不可改变/不变数据的引用的这一概念。
char[] text; // mutable data
const(char)[] ctext; // data may be mutable or immutable - but either way,
// it will not be changed through this reference
invariant(char)[] itext; // immutable data
在D2字符串文本被归类为不可变的数据,因此不能被分配给一个char [],但只有一个const(char)[]
或invariant(char)[]
(或WCHAR或dchar当量)。
string
是invariant(char)[]
,你可能想使用任一为了方便或D1兼容性的别名。