Conversione di una stringa vuota in zero in Ruby
Domanda
Ho una stringa chiamata word
e una funzione chiamata infinitive
tale che
word.infinitive
restituirebbe un'altra stringa in alcune occasioni e una stringa vuota altrimenti
Sto cercando di trovare un'espressione rubino di una riga elegante per lo snippet di codice qui sotto
if word.infinitive == ""
return word
else return word.infinitive
Se l'infinito fosse restituito nullo invece di " " ;, avrei potuto fare qualcosa del genere
(word.infinitive or word)
Ma poiché non lo è, non posso sfruttare il corto circuito O
Idealmente vorrei
1) una singola espressione che potrei facilmente incorporare in un altro codice
2) la funzione infinito viene chiamata una sola volta
3) non aggiungere gemme o plugin personalizzati nel mio codice
Soluzione
Se non ti vergogni del monkeypatching e dell'abuso della sintassi, funzionerebbe:
class String
def | x
if empty? then x else self end
end
end
Quindi puoi pronunciare word.infinitive | parola
, che in realtà esegue una scansione abbastanza naturale, se me lo chiedi.
Tuttavia, penso che un'idea migliore sarebbe quella di modificare il metodo infinito o aggiungerne una versione che restituisca la parola invariata.
Modifica: Ecco una soluzione forse più elegante:
[word.infinitive, word].find {|x| not x.empty?}
Altri suggerimenti
Il metodo ActiveSupport presenza
converte un vuoto (o vuoto?
) stringa in zero
. È progettato per il tuo esatto caso d'uso:
word.infinitive.presence || word
Nota che puoi usare ActiveSupport facilmente fuori dai binari:
require 'active_support/core_ext/object/blank'
Puoi usare una regex come questo articolo suggerisce
(word.infinitive[/.+/m] or word) #Fancy way to convert "" to nil
Fai la cosa giusta: correggi l'infinito in modo che restituisca zero invece di stringhe vuote o avvolgilo con la tua interfaccia se davvero non riesci a toccarlo.
È possibile utilizzare l'operatore ternario (booleano? true-val: false-val)
con String#empty?
return word.infinitive.empty? ? word : word.infinitive
se vuoi chiamare l'infinito solo una volta:
return (inf = word.infinitive).empty? ? word : inf
Potresti anche considerare di aggiungere un po 'di memoization al tuo codice.
Oppure puoi eseguire il monkeypatch di una nuova funzione su String senza dover abusare della sintassi.
class String
def squash
self.empty? ? nil : self
end
end
Ora puoi farlo
puts var.squash or "default text"
Non sono un madrelingua inglese, quindi non so se squash sia la parola migliore. C'è una parola che potrebbe meglio trasmettere l'idea di "trasformarsi in zero solo se vuota"?