web-dev-qa-db-fra.com

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

J'ai lu à travers la programmation de Thomas Ruby 1.9 et suis tombé sur les méthodes alternatives délimitées de guillemets simples et doubles (%q / %Q). Je les connais d'autres références de langage Ruby également.

%q/I'm acting like a single-quoted string/

%Q|"I'm acting like a double-quoted string" --Anonymous|

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

Mis à part la capacité évidente de éviter les guillemets échappant en interne avec des barres obliques inverses, quels sont les cas d'utilisation courants pour cette méthode de citation sur des guillemets simples ou doubles réguliers? Sont-ils généralement utilisés dans des chaînes simples ou multilignes? S'ils sont utilisés dans des cordes multilignes, sont-ils jamais préférés aux cordes HEREDOC? Existe-t-il un idiome particulier Ruby où ils se trouvent couramment?

70
Michael Berkowski

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

link = %q[<a href="javascript:method('call')">link</a>]

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

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. Il fonctionnera avec simple, double ou les deux. Ils sont également beaucoup moins chiants que la méthode de style HEREDOC.

Ruby propose d'autres méthodes pratiques telles que %r qui peut construire des expressions régulières. Cela évite les slash-itis lorsque vous essayez d'en écrire un qui gère des trucs comme http:// qui devrait autrement être échappé.

109
tadman

Présentation

Outre "éviter les citations échappant en interne" et les exemples précédemment fournis par @tadman, il existe également d'autres cas d'utilisation:

  • code auto-généré dans le même langage que le générateur lui-même (par exemple, Ruby générer Ruby)
  • fournir un code correctement formaté qui ne confond pas la fonction de mise en évidence de la syntaxe de votre éditeur de texte
  • permettre le stockage de blocs de code qui peuvent avoir à passer par plusieurs couches de stockage (comme une base de données 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 qui génère automatiquement du code, y compris, mais sans s'y limiter, des outils qui écrivent du code standard dans d'autres langues, ou des outils qui gèrent des extraits de code pour un IDE ou éditeur de texte.

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 syntaxe ou sensiblement similaire que le code du programme de génération.

Dans ces cas, la solution fait beaucoup plus que d'aider à éviter l'utilisation de barres obliques inverses pour échapper aux guillemets. Sans une telle solution, il existe des cas où le code généré peut devenir extrêmement difficile à maintenir.

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

Les références

[Voir par exemple,

]

10
dreftymac

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

3
Dan Garland

Je sais que c'est un vieux thread, mais je les ai utilisés en production lors de l'appel d'une commande system et en voulant interpoler certaines valeurs, comme ceci:

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

Super pratique.

3
Ryan Rebo