D массив языков программирования - PullRequest
7 голосов
/ 17 февраля 2009

Это может звучать очень глупо. но у меня странная проблема с языком программирования D. Когда я пытаюсь создать новый массив, как это:

import std.stdio;

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

Компилятор DMD всегда выдает мне эту ошибку:

test.d (5): Ошибка: не может быть неявно преобразовать выражение («значение») типа инвариант (char [5u]) к char []

Есть идеи, почему? Я использую альфа-версию 2.014 (доступно здесь ) для Ubuntu.

Ответы [ 4 ]

10 голосов
/ 17 февраля 2009

Я искал в разделе руководства по массивам, это может помочь:

Строка - это массив символов. Строковые литералы - это простой способ написания символьных массивов. Строковые литералы являются неизменяемыми (только для чтения).

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

С здесь .

9 голосов
/ 17 февраля 2009

В сущности, строковые литералы хранятся в доступной только для чтения части памяти. char[] - это "изменяемый массив изменяемых символов" , который, если он будет записан, вызовет сбой во время выполнения.

Так что компилятор действительно пытается защитить вас здесь.

invariant(char)[] означает «изменяемый массив инвариантных символов» , что и есть.

PS : если вам не нужно , нужно , чтобы это было char[], вы можете использовать auto, например, auto variable = "value". Освобождает вас от мысли о его типе:)

4 голосов
/ 19 августа 2009

Существует две основные версии языка 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 классифицируются как неизменяемые данные и, следовательно, не могут быть присвоены символу [], а только const(char)[] или invariant(char)[] (или эквивалентам wchar или dchar).

string - это псевдоним invariant(char)[], который вы можете использовать либо для удобства, либо для совместимости с D1.

4 голосов
/ 02 марта 2009

используйте авто и не волнуйтесь, какой тип:

auto s = "some text";

пусть компилятор беспокоится о типе.

...