문제

이것은 정말 어리석은 것처럼 들릴 수 있습니다. 그러나 나는 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 호환성에 사용하려는 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top