57 votes

Ruby 1.9 hachage avec un tiret dans une clé

Dans ruby 1.9, existe-t-il un moyen de définir ce hash avec la nouvelle syntaxe ?

irb> { a:  2 }
=> {:a=>2}

irb> { a-b:  2 }
SyntaxError: (irb):5: syntax error, unexpected tLABEL
{ a-b:  2 }
      ^

avec l'ancien, il fonctionne :

irb> { :"a-b" =>  2 }
=> {:"a-b"=>2}

64voto

Wayne Conrad Points 31052

Certains symboles légitimes ne peuvent pas être utilisés avec la nouvelle syntaxe. Je n'ai pas trouvé de référence, mais il semble qu'un nom de symbole correspondant à /^[a-zA-Z_][a-zA-Z_0-9]*[!?]?$/ est autorisé avec la nouvelle syntaxe. Le dernier caractère peut être le caractère spécial " !" ou " ?".

Pour tout symbole ne répondant pas à ces restrictions, vous devez utiliser la syntaxe Ruby 1.8, :'my-symbol-name'

1 votes

Ce qui est logique ; comment l'interpréteur Ruby est-il censé lire cela, sinon ?

22 votes

Je me suis enregistré parse.c et il semble qu'avec la nouvelle syntaxe le symbole soit interprété comme tLabel de jetons. Et le nom correspondant est plutôt /[a-zA-Z_][a-zA-Z0-9]/ :-)

0 votes

@MBO, des points supplémentaires pour être allé à la source. J'ai modifié l'expression rationnelle dans ma réponse. Je vous remercie !

25voto

Nate Points 366

Pour utiliser les tirets avec la nouvelle syntaxe :

<%= link_to "Link", link_path, {data: {something: 'value1', somethingelse: 'value2'}} %>

Cela générera :

<a href="http://stackoverflow.com/link" data-something='value1' data-somethingelse='value2'>Link</a>

Il se peut que cela ne corresponde pas exactement à votre cas d'utilisation particulier, mais j'ai trouvé cet article en essayant de trouver une réponse moi-même et j'ai donc pensé partager mes conclusions.

2 votes

AFAIK, ceci est spécifique à la data si vous avez d'autres attributs avec des tirets, vous devez utiliser l'ancienne syntaxe.

1 votes

Les Documentation HAML mentionne les attributs des données séparément. En prime, vous pouvez obtenir plusieurs tirets en utilisant des traits de soulignement : data: {author_id: 123} . De très bonnes choses.

24voto

sl80 Points 151

Vous pouvez combiner l'ancienne et la nouvelle syntaxe :

{a: 1, b: 2, :'c-c' => 3, d: 4}

11voto

Stiig Points 1206

Depuis Ruby 2.2, vous pouvez également utiliser la syntaxe suivante :

{a: 1, b: 2, 'c-c': 3, d: 4}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X