2009-02-17 52 views
7

這聽起來確實很愚蠢。但是我用D編程語言遇到了一個奇怪的問題。當我嘗試創建一個新的數組是這樣的:D編程語言字符數組

import std.stdio; 

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

的DMD編譯器總是給我這個錯誤:

test.d(5): Error: cannot implicitly convert expression ("value") of type invariant(char[5u]) to char[]

任何想法,爲什麼?我爲Ubuntu使用了2.014 alpha(可用的here)。

+0

該頁面已過期。請查看ftp.digitalmars.com以獲取最新版本的DMD。 – dsimcha 2009-02-17 14:42:52

+0

你是對的,謝謝。 – user32756 2009-02-17 15:41:49

+1

恆定字已被替換爲不可變且不會存在於穩定版本的D2.x – 2009-08-19 15:29:59

回答

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

+0

非常感謝,應該看看我自己。我不明白關於可變和不可變的整個事情。爲什麼我不能簡單地將一個不可變的char序列分配給一個char數組? – user32756 2009-02-17 14:31:57

9

基本上,它所涉及的是字符串文字存儲在內存的只讀部分。 char[]「可變字符的可變陣列」,如果寫入該字符,則會生成運行時崩潰。

所以編譯器真的試圖在這裏保護你。

invariant(char)[]意味着「一個不變字符的可變陣列」,這正是它是什麼。

PS:當你不需要這是一個char[],你可能想使用auto,如,auto variable = "value"。讓您擺脫考慮它的類型:)

4

使用汽車,也不用擔心是什麼類型:

auto s = "some text"; 

讓有關的類型編譯器擔心。

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)[]invariant(char)[]或(或WCHAR或dchar當量)。

stringinvariant(char)[]的別名,您可能想要將其用於方便或D1兼容性。