문제
이것은 정말 어리석은 것처럼 들릴 수 있습니다. 그러나 나는 D 프로그래밍 언어에 이상한 문제가 있습니다. 다음과 같은 새 배열을 만들려고 할 때 다음과 같습니다.
import std.stdio;
void main()
{
char[] variable = "value";
writefln(variable);
}
DMD 컴파일러는 항상이 오류를 제공합니다.
test.d (5) : 오류 : 유형 불변 (char [5u])의 표현식 ( "value")을 암묵적으로 변환 할 수 없습니다 (char [
이유가 있습니까? 2.014 알파를 사용하고 있습니다 (사용 가능 여기) 우분투를 위해.
해결책
가이드의 배열 섹션을 검색하고 있었는데 도움이 될 수 있습니다.
문자열은 문자 배열입니다. 문자열 리터럴은 캐릭터 배열을 쓰는 쉬운 방법입니다. 문자열 리터럴은 불변입니다 (읽기 만).
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
에서 여기.
다른 팁
기본적으로, 그것이 내려 오는 것은 문자열 리터럴이 메모리의 읽기 전용 부분에 저장된다는 것입니다. char[]
~이다 "돌연변이 가능한 캐릭터의 변이 가능한 배열", 기록하면 런타임 충돌이 발생합니다.
따라서 컴파일러는 실제로 여기에서 당신을 보호하려고합니다.
invariant(char)[]
수단 "변하지 않는 캐릭터의 변이 가능한 배열", 그것이 바로 그것이 무엇인지입니다.
추신: 그렇지 않을 때 필요 그것은 a char[]
, 당신은 사용하고 싶을 수도 있습니다 auto
,에서와 같이, auto variable = "value"
. 그 유형에 대해 생각하지 못하게 해줄 것입니다 :)
자동차를 사용하고 유형이 무엇인지 걱정하지 마십시오.
auto s = "some text";
컴파일러가 유형에 대해 걱정하게하십시오.
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 또는 DCHA 등가물).
string
별명입니다 invariant(char)[]
, 편의성이나 D1 호환성에 사용하려는 것입니다.