2009-03-15 10 views
24

ho una stringa chiamata word e una funzione chiamata infinitive tale che
word.infinitive sarebbero tornati un'altra stringa in alcune occasioni e una stringa vuota altrimenti
Sto cercando di trovare un elegante rubino uno espressione linea per il codice-frammento di sottoConversione di una stringa vuota nella zero in Ruby

if word.infinitive == "" 
     return word 
else return word.infinitive 

infinito era tornato nil invece di "", avrei potuto fare qualcosa di simile

(word.infinitive or word) 

Ma poiché non lo fa, non posso approfittare del corto-circuito OR
Idealmente vorrei
1) una singola espressione che ho potuto facilmente incorporare in altro codice
2) la funzione infinito chiamato solo una volta
3) di non aggiungere alcun gemme personalizzate o plugin nel mio codice

+0

nota che "o" e || fai la stessa cosa, ma || ha una precedenza molto più alta –

+0

in altre parole, entrambi cortocircuiti, è quello che stavo cercando di dire –

risposta

6

Se non ti vergogni di monkeypatching e abusare della sintassi, questo dovrebbe funzionare:

class String 
    def | x 
    if empty? then x else self end 
    end 
end 

allora si può dire word.infinitive | word, che in realtà analizza abbastanza naturalmente, se mi chiedete.

Tuttavia, penso che un'idea migliore sarebbe quella di modificare il metodo infinito, o aggiungere una versione di esso che restituisce la parola invariata.

Edit: Ecco una soluzione forse più elegante:

[word.infinitive, word].find {|x| not x.empty?} 
+0

Questo è intelligente, ma l'OP suona come se si stesse appoggiando a qualcosa di minimamente invasivo. –

+0

questo è invasivo ... ma considerando il fatto che devo fare qualcosa di simile in più occasioni, è un trucco piuttosto utile .. non riesco a immaginare come questo potrebbe rovinare qualsiasi codice in altri luoghi .. grazie –

+0

@ adi92 Suggerirei davvero di riscrivere il metodo infinito, se potessi. –

4

si potrebbe usare l'operatore ternario (boolean ? true-val : false-val) con String#empty?

return word.infinitive.empty? ? word : word.infinitive 

se desideri solo chiamare infinito una volta:

return (inf = word.infinitive).empty? ? word : inf 

Si può anche prendere in considerazione l'aggiunta di qualche memoization al codice.

6

Fare la cosa giusta - fissare infinito in modo che restituisca Nils invece di stringhe vuote, o avvolgerlo con la propria interfaccia Se davvero si può non toccarlo

4

Oppure puoi monkeypatch una nuova funzione in String senza dover abusare della sintassi.

class String 
    def squash 
    self.empty? ? nil : self 
    end 
end 

Ora si può fare

puts var.squash or "default text" 

Io non sono un madrelingua inglese, quindi non so se zucca è la parola migliore. C'è una parola che potrebbe meglio trasmettere l'idea di "trasformarsi in zero solo se vuoti"?

+1

come acout 'nillify?'; P – DGM

+0

Mi piace, penso che userò questo: classe String def nillify self.empty? ? nil: auto fine fine "" .nillify o "foo" => "foo" – DGM

+0

@DGM ho chiamato 'to_nil', anche se non cambia le stringhe non vuote. –

8

È possibile utilizzare una regex come this article suggests

(word.infinitive[/.+/m] or word) #Fancy way to convert "" to nil 
+0

Molto interessante! +1. –

110

Procedimento ActiveSupport presence converte (o blank?) stringa vuota nil. È progettato per il vostro caso esatto utilizzo:

word.infinitive.presence || word 

Nota che si può facilmente utilizzare ActiveSupport al di fuori di rotaie:

require 'active_support/core_ext/object/blank' 
+9

Impossibile aggiornare questo abbastanza – Intrepidd

+0

@Intrepidd Non posso neanche, quindi invierò il tuo commento al contrario. –

Problemi correlati