2012-05-24 27 views
13

Al crear un conjunto de literales en JS:matrices de literales en CoffeeScript

[{ name: 'david', value: 'blue' }, { name: 'harold', value: 'orange' }] 

La única forma que veo de escribir esto en CoffeeScript es:

[ 
    name: 'david' 
    value: 'blue' 
, 
    name: 'harold' 
    value: 'orange' 
] 

para mí esto es bastante feo , esa coma "flotante" realmente no se sienta bien. ¿Hay alguna sintaxis alternativa para esto? Soy consciente de que puedes seguir utilizando un enfoque al estilo JS desde Coffeescript, pero esperaba algo más conciso.

Respuesta

11

Esta ha sido la única cosa con la que todo desarrollador de CoffeeScript parece toparse.

Me temo que es todo lo que tenemos por ahora. La única alternativa que se me ocurre es:

[ 
    { name: 'david', value: 'blue' } 
    { name: 'harold', value: 'orange' } 
] 

... pero está lejos de ser ideal en sí.

Si alguien quisiera sugerir una sintaxis alternativa, concisa y de CS-y, estaría feliz de tratar de implementarla en el analizador y hacer una solicitud de extracción. Me encantaría tener algo mejor que esto.

+1

Lo único que se me ocurrió fue simplemente: [ nombre: 'David ', valor: 'azul' nombre: 'Harold', valor: 'naranja' ] lo siento por los pobres formato, esto es lo que quiero decir: http://pastebin.com/k0QbUjrv Guardaría cuatro caracteres más y la nueva línea sirve como un separador entre los elementos. Sospecho que hay algo más en Coffeescript que impide esto :) –

+0

@colinramsay: Sí, eso también se ve bien para mí; Solo estoy reacio porque ya analiza como una opción única, por lo que rompería la compatibilidad hacia atrás y sería menos probable que fuera aceptado. – Ashe

+0

@colinramsay El problema con que la sintaxis que que sería ambigua, ya que entra en conflicto con el objeto sintaxis literal ([Ejemplo] (http://jashkenas.github.com/coffee-script/#try:obj%20%3D% 20% 0A% 20% 20one% 3A% 201% 2C% 20dos% 3A% 202% 0A% 20% 20% 3A% 203% 2C% 20four% 3A% 204): un objeto literal que toma más de una línea y con más de una propiedad por línea), y los objetos no pueden tener claves repetidas. – epidemian

14

No puedo recordar por qué esto funciona, o incluso si es útil para usted, pero es otra alternativa al código que está escribiendo.

[ 
    {}= name: 'david', value: 'blue' 
    {}= name: 'harold', value: 'orange' 
] 

Yes, this seems to work.

Esto también parece extrañamente a trabajar. Estoy seguro de que hay una razón simple para ello, pero no estoy seguro de eso.

[ 
    {}= 
    name: 'david' 
    value: 'blue' 
    {}= 
    name: 'harold' 
    value: 'orange' 
    {}= 
    name: 'david' 
    value: 'blue' 
] 

See the compiled code.

+0

o_O Esto es realmente extraño. ¡Me gusta! = D – epidemian

+4

'{} =' es una asignación de desestructuración vacía que no destruye nada y simplemente evalúa el operando correcto. '[] =' funciona igual también. – matyr

8

para deshacerse de las comas dentro de los objetos literales se puede ir para:

[ 
    { 
    name: 'david' 
    value: 'blue' 
    }, { 
    name: 'harold' 
    value: 'orange' 
    }, { 
    name: 'david' 
    value: 'blue' 
    } 
] 

o, si lo realmente comas de odio:

[ 
    { 
    name: 'david' 
    value: 'blue' 
    } 
    { 
    name: 'harold' 
    value: 'orange' 
    } 
    { 
    name: 'david' 
    value: 'blue' 
    } 
] 

Aunque personalmente siento que el com flotante Mas, con una sangría de una sola planta, no se ve tan mal:

[ 
    name: 'david' 
    value: 'blue' 
    , 
    name: 'harold' 
    value: 'orange' 
    , 
    name: 'david' 
    value: 'blue' 
] 

creo que hace que sea bastante obvio cuando comienzan objetos literales y acabado y también hace que sea casi imposible de olvidar una coma entre objetos literales = D

0

@Yuki Izumi pregunta cómo debe implementarse esto (no tengo el karma para comentar su respuesta directamente).

Lo que infantilmente intento hacer en CoffeeScript es algo como esto:

arrayOfLiterals = 
    'somekey': 'someval' 
    'otherkey': 'otherval' 
    'keyInOtherArrayElement': 'andItsVal' 
    'yetMoreInSecondElement': 'andItsVal' 
    'thirdElement': 'val' 
    'fourthElement': 'val' 

Ésta es mi granito de arena