Quel est le cas d’utilisation des méthodes de cotation% q /% Q de Ruby?

J’ai lu le programme Ruby 1.9 de Thomas et j’ai découvert les méthodes alternatives de guillemets simples et doubles ( %q / %Q ). Je les connais d’autres références de langage Ruby.

 %q/I'm acting like a single-quoted ssortingng/ %Q|"I'm acting like a double-quoted ssortingng" --Anonymous| 

Je n’ai pas travaillé avec Ruby depuis longtemps, mais je n’ai jamais rencontré cette méthode de citation dans le code de production.

Outre la capacité évidente d’ éviter les guillemets avec des barres obliques inverses en interne , quels sont les cas d’utilisation courants de cette méthode pour citer des guillemets simples ou doubles? Sont-ils généralement utilisés dans des chaînes simples ou multilignes? S’ils sont utilisés dans des chaînes multilignes, sont-ils jamais privilégiés par rapport aux chaînes HEREDOC? Y a-t-il un idiome Ruby particulier où ils sont généralement trouvés?

Ils sont extrêmement utiles pour échapper à HTML avec JavaScript, où vous avez déjà “épuisé” les méthodes de citation:

 link = %q[link] 

Je les ai également trouvés très utiles lorsque vous travaillez avec des instructions SQL multi-lignes:

 execute(%Q[ INSERT INTO table_a (column_a) SELECT value FROM table_b WHERE key='value' ]) 

L’avantage est que vous n’avez pas besoin de faire attention au type de devis utilisé dans votre requête. Cela fonctionnera avec soit simple, double, ou les deux. Ils sont aussi beaucoup moins compliqués que la méthode de style HEREDOC.

Ruby fournit d’autres méthodes pratiques telles que %r qui peuvent construire des expressions régulières. Cela évite les slash-itis quand on essaie d’en écrire un qui gère des choses comme http:// qui devrait autrement être échappé.

Vue d’ensemble

En dehors de “éviter les guillemets internes” et les exemples fournis précédemment par @tadman, il existe également d’autres cas d’utilisation:

  • générer automatiquement du code dans le même langage que le générateur lui-même (par exemple, Ruby générant Ruby)
  • fournir un code au format propre qui ne confond pas la fonctionnalité de mise en évidence de la syntaxe de votre éditeur de texte
  • permettre le stockage de blocs de code susceptibles de traverser plusieurs couches de stockage (par exemple une firebase database interagissant avec un site Web ou un système de gestion d’extraits interagissant avec un éditeur de texte, qui interagit avec un sous-shell, etc.)

Détails

Cette approche est un idiome polyvalent et robuste qui fonctionne bien avec tout type d’outil de génération de code automatisée, y compris, mais sans s’y limiter, les outils qui écrivent du code standard dans d’autres langages ou les outils de gestion de code pour un éditeur de texte ou IDE .

Outre les exemples déjà fournis par @tadman, il y a le cas général de la génération de code où le code généré est la même ou la même syntaxe que le code du programme de génération.

Dans ces cas, la solution fait beaucoup plus que vous aider à éviter l’utilisation de barres obliques inversées pour échapper aux guillemets. Sans une solution comme celle-ci, il existe des cas où le code généré peut être extrêmement difficile à gérer.

Pour en voir des exemples, n’hésitez pas à consulter les références suivantes.

Les références

[Voir par exemple,

]

Il vaut peut-être la peine de noter que% q est utilisé par défaut par bundler et par bijoutier lors de la génération de gemspecs, pour la section summary / description du fichier gemspec. Cela empêche quelqu’un d’utiliser des citations dans le résumé ou la description et de briser le gemspec.

Je sais que c’est un ancien thread, mais je les ai utilisés en production lors de l’appel d’une commande système et je voulais interpoler certaines valeurs, comme ceci:

  system(%Q(ffmpeg -y -i "#{input_filepath}" -qscale:a 2 "#{output_filepath}")) 

Super pratique

Ils sont utiles lorsque votre chaîne contient des guillemets simples ou doubles. Cela n’arrive pas souvent, mais la technique est très utile quand c’est le cas.