2009-02-17 13 views
7

Điều này nghe có vẻ thật ngu ngốc. nhưng tôi có một vấn đề lạ với ngôn ngữ lập trình D. Khi tôi cố gắng tạo ra một mảng mới như thế này:D ngôn ngữ lập trình mảng ăng ten

import std.stdio; 

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

Trình biên dịch DMD luôn mang lại cho tôi lỗi này:

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

Bất cứ ý tưởng tại sao? Tôi đang sử dụng alpha 2.014 (có sẵn here) cho Ubuntu.

+0

Trang đó đã lỗi thời. Kiểm tra ftp.digitalmars.com để có phiên bản DMD mới nhất. – dsimcha

+0

Bạn nói đúng, cảm ơn. – user32756

+1

Từ bất biến đã được thay thế bằng bất biến và sẽ không tồn tại trong bản phát hành ổn định của D2.x –

Trả lời

10

Tôi đã tìm kiếm xung quanh phần mảng của hướng dẫn, điều này có thể giúp:

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 

Từ here.

+0

Cảm ơn rất nhiều, nên đã có một cái nhìn bản thân mình. Tôi không hiểu toàn bộ điều về sự biến đổi và bất biến không thực sự mặc dù. Tại sao tôi không thể chỉ đơn giản là gán một chuỗi char bất biến vào một mảng char? – user32756

+0

vì biến của bạn là một con trỏ mảng _mutable_ char, có nghĩa là, một con trỏ tới mảng char có thể thay đổi được và bạn đang cố gắng trỏ đến một mảng _inmutable_ char. – Javier

+0

http://bartoszmilewski.wordpress.com/2009/02/05/immutable-things-where-do-they-all-come-from/ có thể đáng đọc –

9

Về cơ bản, những gì nó xảy ra là các chuỗi ký tự chuỗi được lưu trữ trong phần chỉ đọc của bộ nhớ. char[]"một mảng có thể thay đổi của các ký tự có thể thay đổi", nếu được viết, sẽ tạo ra sự cố thời gian chạy.

Vì vậy, trình biên dịch thực sự đang cố gắng bảo vệ bạn ở đây.

invariant(char)[] có nghĩa là "một mảng có thể thay đổi của các ký tự bất biến", chính xác nó là gì.

PS: Khi bạn không cần nó trở thành một char[], bạn có thể muốn sử dụng auto, như trong, auto variable = "value". Giải phóng bạn khỏi suy nghĩ về loại hình của nó :)

+0

Cảm ơn bạn đã giải thích rất rõ ràng và đơn giản, FeppingCreature. – user32756

4

sử dụng ô tô và đừng lo lắng gì loại là:

auto s = "some text"; 

để lo lắng biên dịch về loại.

4

Có hai phiên bản chính của ngôn ngữ D. Nói chung, chúng không tương thích lẫn nhau, mặc dù mã có thể được viết để biên dịch cả hai.

D1 là mã mà bạn cung cấp có vẻ như được viết. Nó không có khái niệm về mảng bất biến, do đó công trình này hoạt động.

D2 là những gì bạn đang cố gắng biên dịch nó, vì thế 2 bắt đầu số phiên bản trình biên dịch. Một trong những tính năng chính của D2 là khái niệm const và tham chiếu dữ liệu bất biến/bất biến.

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 

literals String trong D2 được phân loại như là dữ liệu không thay đổi, và do đó không thể được gán cho một char [], nhưng chỉ có một const(char)[] hoặc invariant(char)[] (hoặc WCHAR hoặc tương đương dchar).

string là bí danh của invariant(char)[], bạn có thể muốn sử dụng để thuận tiện hoặc tương thích D1.

+3

Từ bất biến đã được thay thế bằng bất biến và sẽ không tồn tại trong bản phát hành ổn định của D2.x –

+0

Tôi đã đi theo spec - ngoại trừ rằng digitalmars.com/d/2.0/const3.html dường như bây giờ cuối cùng đã được sửa. Theo hầu hết các trang khác, từ này vẫn là bất biến. (Tôi cũng nghĩ rằng bạn sẽ thấy rằng bất biến sẽ luôn luôn là từ cho bất biến lớp, nhưng đó là một sang một bên.) – Stewart