7

这听起来可能很愚蠢。但我对 D 编程语言有一个奇怪的问题。当我尝试像这样创建一个新数组时:

import std.stdio;

void main()
{
    char[] variable = "value";
    writefln(variable);
}

DMD 编译器总是给我这个错误:

test.d(5):错误:无法将不变量(char[5u])类型的表达式(“值”)隐式转换为 char[]

知道为什么吗?我正在为 Ubuntu 使用 2.014 alpha(可在此处获得)。

4

4 回答 4

10

我正在搜索指南的数组部分,这可能会有所帮助:

字符串是一个字符数组。字符串文字只是编写字符数组的一种简单方法。字符串文字是不可变的(只读)。

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

这里

于 2009-02-17T14:24:10.800 回答
9

基本上,归结为字符串文字存储在内存的只读部分中。char[]“可变字符的可变数组”,如果将其写入,将产生运行时崩溃。

所以编译器真的想在这里保护你。

invariant(char)[]意思是“一个可变的不变字符数组”,这正是它的本质。

PS:当你不需要它是一个char[],你可能想使用auto,如,auto variable = "value"。让您无需考虑它的类型 :)

于 2009-02-17T14:43:01.050 回答
4

使用 auto 并且不要担心类型是什么:

auto s = "some text";

让编译器担心类型。

于 2009-03-02T03:23:11.903 回答
4

D 语言有两个主要版本。通常,它们相互不兼容,尽管可以编写代码以在两者中编译。

D1 是您提供的代码似乎是用它编写的。它没有不可变数组的概念,因此这是可行的。

D2 是您尝试将其编译为的内容,因此 2 开始编译器版本号。D2 特有的主要特性之一是 const 和不可变/不变数据引用的概念。

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)[]or invariant(char)[](或 wchar 或 dchar 等价物)。

string是 的别名invariant(char)[],您可能希望使用它来方便或与 D1 兼容。

于 2009-08-18T21:44:10.370 回答