2011-04-14 11 views
5
void main(){  
    int[3] arr = [1, 2, 3,];  
} 

¿La coma adicional es legal o no está marcada como error debido a un error del compilador? Tengo muchas mezclas que generan matrices con la coma adicional al final. Me gustaría saber si debería tomarme el tiempo para eliminarlos.Comas adicionales en matrices

incluso esto se compila sin errores:

void main(){  
    int[3] arr = [1, 2, 3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,];  
} 
+0

Tenga en cuenta que esto ya no funcionará en D2. – user1461607

Respuesta

7

Creo que es legal con el fin de permitir la plantillas (o incluso mixins) para trabajar de una manera genérica:

template Foo(T) { }      //What if Foo is empty like this? 

auto arr = [1, 2, Foo!(int), Foo!(long)]; 
//   [1, 2, , ] 

Se hace plantillas mucho más fácil de trabajar, para que no tenga que tener un caso especial contra salidas especiales.

Un ejemplo más realista:

template Iota(size_t start, size_t end) //All integers in range [start, end) 
{ 
    static if (start < end) 
     alias TypeTuple!(start, Iota!(start + 1, end)) Iota; 
    else 
     alias TypeTuple!() Iota; 
} 

auto arr1 = [-10, Iota!(0, 3)]; // arr is now [-10, 0, 1, 2] 
auto arr2 = [-10, Iota!(a, b)]; // arr is now [-10, a .. b] 

Ahora qué sucede si a es igual a b? Luego, arr2 se descompone en [-10, ].

+0

También puede ser útil en la generación de código – cybevnm

+0

Esto es exactamente por qué es legal, @vnm, las plantillas son generación de código. –

+3

Creo que esta respuesta es casi irrelevante porque IIRC todos los casos mencionados aquí (aparte de string mixins) se expanden como estructuras de datos, no como texto: es decir, las comas son relevantes solo para el analizador y no para el código de expansión de la plantilla. – BCS

4

está permitido en muchos idiomas para permitir código de formato, como:

string[3] arr = [ 
    "Some long String", 
    "And another", 
    "etc, etc, etc", 
    ]; 

sin tener que omitir la coma desde el último valor.

Java también permite este inicializador de matriz.

3

favor verifique este post

.NET now support trailing comma in array like python does

Muchos compiladores permiten arrastrando comas en serie.

+1

C++ solo permite una coma al final; algo más que uno es un error. Vengo de C++, y con el estado actual de los compiladores D, no estaba seguro de qué pensar. – Arlen

1

Estoy 99% seguro de que la coma simple es por diseño. El 2º, 3º, etc.? En mi humilde opinión, es un error en el diseño o la implementación, pero no sé cuál.

1

Hace algunos meses Walter cometió este comportamiento en dmd. Antes, a veces se permitía una coma final y otras no, y si estás en tierra dmd1, estás atrapado con eso.

Ahora, para dmd2, al menos, una coma final siempre debe ser válida en una matriz literal, así como en listas de parámetros, listas de argumentos y listas de argumentos de plantilla.

Las comas múltiples al final, sin embargo, son un error en la implementación.