Điều đó phụ thuộc vào việc bạn muốn lặp qua các đơn vị mã hoặc điểm mã. Ngôn ngữ tự lặp trên mảng bởi các phần tử mảng, và chuỗi là mảng của các đơn vị mã, vì vậy nếu bạn chỉ cần sử dụng foreach
với kiểu suy luận, sau đó với
foreach(c; "La Verité")
writeln(c);
hai ký tự cuối cùng in sẽ vô nghia, vì é
là một điểm mã gồm hai đơn vị mã UTF-8 và bạn đang in ra các đơn vị mã riêng lẻ (vì char
là đơn vị mã UTF-8). Trong khi đó, nếu bạn thực hiện
foreach(dchar c; "La Verité")
writeln(c);
thì thời gian chạy sẽ giải mã đơn vị mã thành điểm mã và é
sẽ được in làm ký tự cuối cùng. Nhưng không cái nào trong số này thực sự hoạt động trên các chuỗi như các phạm vi. foreach
hoạt động trên mảng nguyên bản mà không phải sử dụng API phạm vi đầu vào. Tuy nhiên, đối với tất cả các loại chuỗi, API phạm vi trông giống như
@property bool empty();
@property dchar front();
void popFront();
Nó hoạt động trên dây như dãy dchar
-không loại đơn vị mã của họ. Điều này tránh các vấn đề với các chức năng như std.algorithm.filter
hoạt động trên các đơn vị mã riêng lẻ, vì điều đó sẽ không có ý nghĩa. Hoạt động trên các điểm mã không phải là chính xác 100%, vì Unicode rất phức tạp liên quan đến việc kết hợp các điểm mã và đồ thị và điều gì đó, nhưng hoạt động trên các điểm mã gần đến mức chính xác hơn (và tôi tin rằng hỗ trợ cho graphemes vào thư viện chuẩn cho các trường hợp mà bạn cần và sẵn sàng trả hit hiệu suất). Vì vậy, có API phạm vi cho chuỗi hoạt động trên chúng như dãy dchar
là xa chính xác hơn, và nếu bạn đã làm điều gì đó như
foreach(c; filter!"true"("La Verité"))
writeln(c);
bạn sẽ iterating qua dchar
, và é
sẽ in một cách chính xác.Nhược điểm của tất cả điều này là thực tế là foreach
trên chuỗi hoạt động theo cấp độ đơn vị mã theo mặc định trong khi API phạm vi cho chuỗi hoạt động trên chúng dưới dạng điểm mã, vì vậy bạn phải cẩn thận khi trộn các hoạt động mảng và dựa trên phạm vi hoạt động trên chuỗi. Đó cũng là lý do tại sao string
và wstring
không được coi là phạm vi truy cập ngẫu nhiên - chỉ là phạm vi hai chiều. Bạn không thể truy cập ngẫu nhiên trong O (1) trên các điểm mã khi chúng được tạo thành từ số lượng đơn vị mã khác nhau (trong khi dstring
là phạm vi truy cập ngẫu nhiên, bởi vì với UTF-32, mọi đơn vị mã là điểm mã).
Nguồn
2013-05-16 17:25:37
http://ddili.org/ders/d.en/ranges.html – sigod
@sigod, yea, nên đã kiểm tra sách của Ali! Nó chắc chắn là đi đến tài nguyên để đọc lên trên D công cụ ngay bây giờ. –