D编程语言char数组

时间:2009-02-17 14:19:46

标签: arrays d dmd

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

import std.stdio;

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

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

  

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

知道为什么吗?我正在为Ubuntu使用2.014 alpha(可用here)。

4 个答案:

答案 0 :(得分:10)

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

A string is an array of characters. String literals are just an easy way to write character arrays. String literals are immutable (read only).

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

来自here

答案 1 :(得分:9)

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

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

invariant(char)[]表示“一个可变数组的不变字符”,这正是它的原因。

PS :当您 需要为char[]时,您可能希望使用auto,如,{ {1}}。让你不要考虑它的类型:)

答案 2 :(得分:4)

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

auto s = "some text";

让编译器担心类型。

答案 3 :(得分:4)

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

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

D2是你试图编译它,因此2开始编译器版本号。 D2特有的主要特性之一是const和immutable / invariant数据引用的概念。

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兼容性。