2012-09-05 42 views
7

tôi cố gắng để biên dịch mã sau:std.algorithm.joiner (string [], string) - tại sao các phần tử kết quả là dchar chứ không phải char?

import std.algorithm; 
void main() 
{ 
    string[] x = ["ab", "cd", "ef"]; // 'string' is same as 'immutable(char)[]' 
    string space = " "; 
    char z = joiner(x, space).front(); // error 
} 

Compilation với dmd kết thúc với lỗi:

test.d(8): Error: cannot implicitly convert expression (joiner(x,space).front()) of type dchar to char 

Thay đổi char z-dchar z không sửa chữa được thông báo lỗi, nhưng tôi quan tâm đến lý do tại sao nó xuất hiện trong địa điểm đầu tiên.

Tại sao kết quả của joiner(string[],string).front() là dchar chứ không phải char?

Trả lời

11

Tất cả các dây được coi là phạm vi của dchar (Không có gì về vấn đề này trong tài liệu http://dlang.org/phobos/std_algorithm.html#joiner là). Đó là bởi vì dchar được đảm bảo là một điểm mã, vì trong UTF-32, mỗi đơn vị mã là một điểm mã, trong khi ở UTF-8 (char) và UTF-16 (wchar), số đơn vị mã trên mỗi mã điểm khác nhau. Vì vậy, nếu bạn đang hoạt động trên các cá nhân char s hoặc wchar s, bạn sẽ hoạt động trên các phần ký tự thay vì toàn bộ ký tự, điều này sẽ rất tệ. Nếu bạn không biết nhiều về unicode, tôi khuyên bạn nên đọc this article bởi Joel Spolsky. Nó giải thích mọi thứ khá tốt.

Trong mọi trường hợp, bởi vì hoạt động trên từng char s và wchar s không có ý nghĩa, chuỗi charwchar được coi là phạm vi của dchar (ElementType!stringdchar), có nghĩa là xa như dãy được quan tâm, họ không có length (hasLength!stringfalse - walkLength cần được sử dụng để có chiều dài), không thể cắt lát (hasSlicing!stringfalse) và không thể lập chỉ mục (isRandomAccess!stringfalse). Điều này cũng có nghĩa là bất kỳ thứ gì tạo nên một phạm vi mới từ bất kỳ loại chuỗi nào cũng sẽ dẫn đến phạm vi dchar. joiner là một trong số đó. Có một số hàm hiểu chuỗi unicode và chuỗi trường hợp đặc biệt cho hiệu quả, tận dụng chiều dài, cắt và lập chỉ mục ở nơi chúng có thể, nhưng trừ khi kết quả của chúng cuối cùng là một phần của bản gốc, bất kỳ phạm vi nào chúng trả về sẽ phải được thực hiện trong số dchar s.

Vì vậy, front trên bất kỳ phạm vi ký tự nào sẽ luôn là dcharpopFront sẽ luôn bật ra một điểm mã đầy đủ.

Nếu bạn không biết nhiều về phạm vi, tôi khuyên bạn nên đọc this. Đó là một chương trong một cuốn sách về D trực tuyến và hiện là hướng dẫn tốt nhất về các phạm vi mà chúng tôi có. Chúng tôi thực sự cần có được một bài viết thích hợp về các phạm vi (bao gồm cả cách họ làm việc với các chuỗi) trên dlang.org, nhưng chưa có ai đăng ký để viết nó. Bất kể, bạn sẽ cần phải có ít nhất một nắm bắt cơ bản của phạm vi để có thể sử dụng rất nhiều thư viện chuẩn của D (đặc biệt là std.algorithm), bởi vì nó sử dụng chúng rất nhiều.

Các vấn đề liên quan