Qual è il caso d’uso dei metodi di quotatura di% q /% Q di Ruby?

Ho letto il programma Ruby 1.9 di Thomas e mi sono imbattuto nei metodi delimitati a virgolette singole e doppie ( %q / %Q ). Ne ho conosciuti anche da altri riferimenti al linguaggio Ruby.

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

Non ho lavorato a lungo con Ruby, ma non ho mai incontrato questo metodo di quoting nel codice di produzione.

Oltre all’ovvia capacità di evitare di sfogliare internamente le virgolette con i backslash, quali sono i casi d’uso comuni per questo metodo di quoting su virgolette semplici o doppie? Vengono tipicamente utilizzati in stringhe singole o multilinea? Se utilizzati in stringhe multiline, sono mai stati preferiti rispetto alle stringhe HEREDOC? Esiste un particolare linguaggio Ruby in cui vengono comunemente trovati?

Sono straordinariamente utili per sfuggire all’HTML con JavaScript al suo interno, dove hai già “esaurito” i metodi di quotatura:

 link = %q[link] 

Ho anche trovato che sono molto utili quando si lavora con istruzioni SQL multilinea:

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

Il vantaggio è che non è necessario prestare attenzione al tipo di quotazione utilizzato all’interno della query. Funzionerà con singolo, doppio o entrambi. Sono anche molto meno complicati del metodo di stile HEREDOC.

Ruby fornisce altri metodi di convenienza come questo come %r che può build espressioni regolari. Ciò evita il taglio quando si cerca di scriverne uno che gestisca cose come http:// che altrimenti dovrebbero essere sfuggite.

Panoramica

Oltre a “evitare le virgolette di escape interne” e gli esempi precedentemente forniti da @tadman ci sono anche altri casi d’uso:

  • codice di auto-generazione nella stessa lingua del generatore stesso (es. Ruby che genera Ruby)
  • fornendo un codice formattato in modo pulito che non confonda la funzione di evidenziazione della syntax del tuo editor di testo
  • consentire l’archiviazione di blocchi di codice che potrebbero dover passare attraverso più livelli di archiviazione (ad esempio un database che interagisce con un sito Web o un sistema di gestione di frammenti che interagisce con un editor di testo, che interagisce con una subshell e così via)

Dettagli

Questo approccio è un idioma generico e robusto che funziona bene con qualsiasi tipo di strumento che consente la generazione automatica di codice, inclusi ma non limitati a strumenti che scrivono codice boilerplate in altre lingue o strumenti che gestiscono frammenti di codice per un IDE o un editor di testo .

Oltre agli esempi già forniti da @tadman, vi è il caso generale di generare codice in cui il codice generato è la stessa syntax simile o sostanzialmente simile al codice del programma di generazione.

In questi casi, la soluzione fa molto di più che aiutare a evitare l’uso di barre rovesciate per evitare le virgolette. Senza una soluzione come questa, ci sono casi in cui il codice generato può diventare estremamente difficile da mantenere.

Per vedere esempi di questo, sentiti libero di dare un’occhiata ai seguenti riferimenti.

Riferimenti

[Vedi ad esempio,

]

Vale forse la pena notare che% q viene utilizzato da bundler e jeweler per impostazione predefinita durante la generazione di gemspecs, per la sezione riepilogo / descrizione di gemspec. Ciò impedisce a qualcuno di utilizzare le virgolette nel sumrio o nella descrizione e di rompere il gemspec.

So che questo è un thread vecchio, ma li ho utilizzati in produzione quando si chiama un comando di sistema e si desidera interpolare alcuni valori, in questo modo:

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

Super pratico.

Sono utili quando la tua stringa contiene virgolette singole o doppie. Questo non succede spesso, ma la tecnica è molto utile quando lo fa.