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

È stato utile?

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"?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top