2012-09-05 9 views
7

intento compilar código siguiente:std.algorithm.joiner (string [], string): ¿por qué los elementos de resultado son dchar y no 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 
} 

Compilación con dmd termina con el error:

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

Cambio char z a dchar z hace solucionar el mensaje de error, pero me interesa por qué aparece en el primer lugar.

¿Por qué resultado de joiner(string[],string).front() es dchar y no char?

(no hay nada en esta documentación en http://dlang.org/phobos/std_algorithm.html#joiner)

Respuesta

11

Todas las cadenas son tratados como rangos de dchar. Esto se debe a que se garantiza que un dchar sea un único punto de código, ya que en UTF-32, cada unidad de código es un punto de código, mientras que en UTF-8 (char) y UTF-16 (wchar), punto varía Entonces, si estuvieras operando en los char s individuales o wchar s, estarías operando en pedazos de caracteres en lugar de caracteres enteros, lo que sería muy malo. Si no sabes mucho sobre Unicode, te aconsejo que leas this article de Joel Spolsky. Explica las cosas bastante bien.

En cualquier caso, debido a que operan en char s individuales y wchar s no tiene sentido, las cadenas de char y wchar son tratados como rangos de dchar (ElementType!string es dchar), lo que significa que por lo que se refiere a los rangos, se no tienen length (hasLength!string es false - walkLength tiene que ser utilizado para obtener su longitud), no son rebanar (hasSlicing!string es false), y no son indexables (isRandomAccess!string es false). Esto también significa que cualquier cosa que genere un nuevo rango a partir de cualquier tipo de cadena dará como resultado un rango de dchar. joiner es uno de esos. Hay algunas funciones que entienden el Unicode y cadenas de casos especiales para la eficiencia, aprovechando la longitud, el corte y la indexación donde pueden, pero a menos que su resultado sea en última instancia una porción del original, cualquier rango que devuelvan tendrá que hacerse de dchar s.

Por lo tanto, front en cualquier rango de caracteres siempre será dchar, y popFront siempre mostrará un punto de código completo.

Si no sabe mucho acerca de los rangos, le aconsejo que lea this. Es un capítulo de un libro sobre D que está en línea y actualmente es el mejor tutorial sobre los rangos que tenemos. Realmente deberíamos obtener un artículo apropiado sobre los rangos (incluso sobre cómo funcionan con cadenas) en dlang.org, pero nadie ha estado a punto de escribirlo todavía. De todos modos, necesitará tener al menos una comprensión básica de los rangos para poder utilizar una gran cantidad de la biblioteca estándar de D (especialmente std.algorithm), ya que los usa mucho.

Cuestiones relacionadas