这可能听起来很笨。但我有与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

rel="noreferrer">。

其他提示

基本上,它归结为是字符串常量存储在一个只读存储器部分。 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当量)。

stringinvariant(char)[],你可能想使用任一为了方便或D1兼容性的别名。

scroll top