2012-03-14 9 views
5

Estoy escribiendo una gema Ruby usando la sintaxis {key: 'value'} para hash en todo mi código. Todos mis exámenes pasan en 1.9.x, pero comprendo (comprensiblemente) syntax error, unexpected ':', expecting ')' en 1.8.7.Compatible con la sintaxis hash de Ruby 1.9 en Ruby 1.8

¿Existe una mejor práctica para soportar el 1.8.x? ¿Necesito reescribir el código usando nuestro viejo amigo =>, o hay una mejor estrategia?

+1

Ruby 1.8 se desvanecerá pronto. No necesitas apoyo para eso. – sawa

+3

¿Es esa una opinión popular? Ciertamente estoy buscando aportes sobre lo que otros autores de gemas están haciendo. Sé que hay un gran impulso dentro de la comunidad de Ruby para que todos entren en el tren 1.9. Personalmente no me importa dejar atrás 1.8. – JackCA

Respuesta

16

Creo que estás de suerte, si quieres soportar 1.8 entonces tienes que usar =>. Como de costumbre, mencionaré que debe usar => en ciertos casos en 1.9:

  1. Si la clave no es un símbolo. Recuerde que cualquier objeto (símbolos, cadenas, clases, flotadores, ...) puede ser una clave en un Ruby Hash.
  2. Si necesita un símbolo que citaría: :'this.that'.
  3. Si usa MongoDB para prácticamente cualquier cosa, estará utilizando cosas como :$set => hash pero $set: hash es un error de sintaxis.

Regrese a nuestra programación programada regularmente.

¿Por qué digo que no tiene suerte? Las sintaxis literales Hash (las dos) están cableadas en el analizador y no creo que vayas a tener mucha suerte parcheando el analizador de tu gema. Ruby 1.8.7's parse.y tiene esto que decir:

assoc : arg_value tASSOC arg_value 
      { 
       $$ = list_append(NEW_LIST($1), $3); 
      } 
     ; 

y tASSOC es => literales de modo de patata son cableados a utilizar =>. 1.9.3's dice esto:

assoc : arg_value tASSOC arg_value 
      { 
      /*%%%*/ 
       $$ = list_append(NEW_LIST($1), $3); 
      /*% 
       $$ = dispatch2(assoc_new, $1, $3); 
      %*/ 
      } 
     | tLABEL arg_value 
      { 
      /*%%%*/ 
       $$ = list_append(NEW_LIST(NEW_LIT(ID2SYM($1))), $2); 
      /*% 
       $$ = dispatch2(assoc_new, $1, $2); 
      %*/ 
      } 
     ; 

Tenemos la sintaxis de grasa de flecha de nuevo (arg_value tASSOC arg_value) y el estilo de JavaScript (tLABEL arg_value); AFAIK, tLABEL es también la fuente de las restricciones sobre qué tipo de símbolos (no :$set, no :'this.that', ...) se pueden utilizar con la sintaxis de estilo de JavaScript. El tronco actual parse.y coincide con 1.9.3 para los literales Hash.

Por lo tanto, la sintaxis literal de Hash está integrada en el analizador sintáctico y está bloqueado con flechas gordas si desea admitir 1.8.

+0

respuesta muy agradable y completa, mu. Parece que debería reescribir las instancias en las que utilizo la sintaxis de estilo JS. Solo desearía que hubiera una forma de admitir versiones heredadas sin escribir código heredado. Esta podría ser la mejor opción sin embargo. – JackCA

1

Ruby 1.8.7 no admite la nueva sintaxis hash.

Si necesita desesperadamente la sintaxis de hash sobre la no YARV implementación basada en c de Ruby, hay un sustento alguno rama 1.8 cabeza, por lo que can hace

rvm install ruby-head --branch ruby_1_8 ; rvm ruby-head 
ruby -v 
ruby 1.8.8dev (2011-05-25) [i386-darwin10.7.0] 

pero la actualización a 1.9 es la manera de ir.

+0

Creo que la intención de JackCA es proporcionar una gema que un Ruby 1.8 usuarios pueden usar, no es que JackCA esté usando Ruby 1.8. Entonces no creo que esto ayude. – sawa

Cuestiones relacionadas