2009-03-15 17 views
24

He una cadena denominada word y una función llamada infinitive tal que
word.infinitive volvería otra cadena en algunas ocasiones y una cadena vacía de lo contrario
Estoy tratando de encontrar un elegante rubí uno la expresión de la línea para el código siguiente fragmentola conversión de una cadena vacía en nil en Ruby

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

infinitivo había vuelto nulo en lugar de "", que podría haber hecho algo así como

(word.infinitive or word) 

Pero ya no es así, no puedo aprovechar el cortocircuito o
Idealmente me gustaría
1) una sola expresión que fácilmente pude incrustar en infinitivo función que se llama otro código
2) sólo una vez
3) de no añadir ningún joyas o complementos personalizados en mi código

+0

Tenga en cuenta que "o" y || haz lo mismo, pero || tiene una precedencia mucho más alta –

+0

en otras palabras, ambos son en cortocircuito, es lo que estaba tratando de decir –

Respuesta

6

Si usted no está avergonzado de monkeypatching y abusar de la sintaxis, esto funcionaría:

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

entonces se puede decir word.infinitive | word, que en realidad bastante escanea de forma natural, si me preguntas.

Sin embargo, creo que una mejor idea sería modificar el método infinitivo o agregar una versión que devuelva la palabra sin cambios.

Editar: he aquí una solución, posiblemente, más elegante:

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

Eso es inteligente, pero el OP parece que se inclina hacia algo mínimamente invasivo. –

+0

esto es invasivo ... pero teniendo en cuenta el hecho de que tengo que hacer algo como esto en múltiples ocasiones, es un truco bastante útil ... no puedo imaginar cómo esto arruinaría cualquier código en otros lugares ... gracias –

+0

@ adi92 Realmente sugeriría reescribir el método infinitivo si pudiera. –

4

se puede utilizar el operador ternario (boolean ? true-val : false-val) con String#empty?

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

si sólo desea llamar infinitivo vez:

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

También es posible que desee considerar la adición de un poco memoization a su código.

6

Hacer lo correcto - fijar infinitivo para que vuelva Nils en lugar de cadenas en blanco, o envolverlo con su propia interfaz de si realmente puede no lo toques.

4

O puede hacer una nueva función de parche a String sin tener que abusar de la sintaxis.

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

Ahora usted puede hacer

puts var.squash or "default text" 

No soy un hablante nativo de Inglés, así que no sé si calabaza es la mejor palabra. ¿Hay alguna palabra que transmita mejor la idea de "convertir en cero solo si está vacío"?

+1

cómo acout' nillify? '; P – DGM

+0

Me gusta, creo que estaré usando esto algunos: clase Cadena def nillify self.empty? ? nil: auto final final "" .nillify o "foo" => "foo" – DGM

+0

@DGM me llamó 'to_nil', aunque no cambia las cadenas no vacías. –

8

Usted puede usar una expresión regular como this article suggests

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

¡Muy interesante! +1. –

110

El método presence ActiveSupport convierte una cadena vacía (o blank?) a nil. Está diseñado para su uso exacto caso:

word.infinitive.presence || word 

Tenga en cuenta que puede utilizar simplemente ActiveSupport fuera de los carriles:

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

No puedo votar lo suficiente – Intrepidd

+0

@Intrepidd Tampoco puedo, así que en su lugar votaré votando tu comentario. –

Cuestiones relacionadas