2012-09-05 28 views
7

kod aşağıdaki derlemeye deneyin: std.algorithm.joiner (string [], string) - neden sonuç öğeleri dchar ve char değil?

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 
} 

dmd ile Derleme hatası ile sona erer

:

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

dchar z için char z hata mesajı düzeltmek yapar değiştirilmesi, ancak göründüğü neden İlgileniyorum ilk yer.

Neden joiner(string[],string).front() sonucu dchar ve değil char?

cevap

11

Tüm dizeleri dchar aralıkları olarak kabul edilir (belgelerinde http://dlang.org/phobos/std_algorithm.html#joiner bu konuda hiçbir şey yoktur). Bunun nedeni, dchar'un tek bir kod noktası olması garantisidir, çünkü UTF-32'de her kod birimi bir kod noktasıdır, oysa UTF-8'de (char) ve UTF-16'da (wchar), kod başına kod birimi sayısı nokta değişir. Dolayısıyla, char s ya da wchar s üzerinde çalışıyorsanız, tüm karakterler yerine karakter parçaları üzerinde çalışıyor olursunuz, bu çok kötü olur. Unicode hakkında fazla bir şey bilmiyorsanız, Joel Spolsky tarafından this article'u okumanızı tavsiye ederim. Olayları oldukça iyi açıklıyor. Her durumda

, bireysel char s ve wchar s faaliyet mantıklı değil, çünkü char ve wchar ait dizeleri anlam dchar aralıkları ( ElementType!string dchar olduğu) olarak muamele görmesi kadarıyla aralıkları, onlar söz konusu olduğunda ( hasLength!string false - onların boyunu almak için kullanılacak walkLength ihtiyaçlar) length yok ( isRandomAccess!string false olan) ( hasSlicing!string false olan) dilimlenebilir değildir ve dizine eklenebilir değildir. Bu aynı zamanda, her türlü diziden yeni bir aralık oluşturan her şeyin dchar aralığında sonuçlanacağı anlamına gelir. joiner bunlardan biridir. Verimlilik için unicode ve özel durum dizelerini anlayabilen, uzunluk, dilimleme ve indeksleme yapabildikleri yerlerden yararlanan bazı işlevler vardır, ancak sonuç nihayetinde orijinalin bir parçası olmadıkça, döndürecekleri herhangi bir aralığın yapılması gerekecektir. dchar s.

Herhangi bir karakter aralığı üzerinde, her zaman dchar ve popFront her zaman tam bir kod noktasını kapatacaktır.

Aralıklar hakkında fazla bilgi sahibi değilseniz, this numaralı telefonu okumanızı öneririm. Bu, çevrimiçi olan ve şu anda sahip olduğumuz aralıklardaki en iyi öğretici olan D'deki bir kitaptaki bir bölüm. Aralıklardaki (makale dizileriyle nasıl çalıştıklarını da içeren) dlang.org'a uygun bir makale almalıyız, ancak henüz yazmamak için etrafta kimse yok. Ne olursa olsun, çok fazla D'nin standart kütüphanesini (özellikle std.algorithm) kullanabilmek için en azından temel aralıklara sahip olmanız gerekecek, çünkü bunları çok yoğun kullanıyor.