Conversion d'une chaîne vide en nil en Ruby
Question
J'ai une chaîne appelée mot
et une fonction appelée infinitive
telle que
word.infinitive
renverrait une autre chaîne à certaines occasions et une chaîne vide sinon
J'essaie de trouver une élégante expression d'une ligne rubis pour l'extrait de code ci-dessous
if word.infinitive == ""
return word
else return word.infinitive
Si l'infinitif avait renvoyé la valeur nil au lieu de """, j'aurais pu faire quelque chose comme
(word.infinitive or word)
Mais comme ce n'est pas le cas, je ne peux pas profiter du court-circuit OU
Idéalement, j'aimerais avoir
1) une expression unique que je pourrais facilement intégrer à un autre code
2) la fonction infinitive étant appelée une seule fois
3) ne pas ajouter de gemmes personnalisées ou de plugins dans mon code
La solution
Si vous n’êtes pas honteux de monkeypatching et d’abus de syntaxe, cela fonctionnerait:
class String
def | x
if empty? then x else self end
end
end
Ensuite, vous pouvez dire word.infinitive | mot
, qui numérise en fait assez naturellement, si vous me le demandez.
Cependant, je pense qu’une meilleure idée serait de modifier la méthode infinitive ou d’ajouter une version de celle-ci qui renvoie le mot inchangé.
Edit: Voici une solution peut-être plus élégante:
[word.infinitive, word].find {|x| not x.empty?}
Autres conseils
La méthode presence
d'ActiveSupport convertit une méthode vide (ou vide?
) chaîne à nil
. Il est conçu pour votre cas d'utilisation exact:
word.infinitive.presence || word
Notez que vous pouvez facilement utiliser ActiveSupport en dehors des rails:
require 'active_support/core_ext/object/blank'
Vous pouvez utiliser un regex tel que cet article. suggère
(word.infinitive[/.+/m] or word) #Fancy way to convert "" to nil
Faites le bon choix - corrigez l'infinitif pour qu'il renvoie nils au lieu de chaînes vierges, ou enveloppez-le avec votre propre interface si vous ne pouvez vraiment pas le toucher.
Vous pouvez utiliser l'opérateur ternaire (boolean? true-val: false-val)
avec String # empty?
return word.infinitive.empty? ? word : word.infinitive
si vous ne souhaitez appeler qu'une fois l'infinitif:
return (inf = word.infinitive).empty? ? word : inf
Vous pouvez également envisager d'ajouter une mémoization à votre code.
Vous pouvez également synchroniser une nouvelle fonction avec String sans devoir abuser de la syntaxe.
class String
def squash
self.empty? ? nil : self
end
end
Maintenant, vous pouvez faire
puts var.squash or "default text"
Je ne suis pas un anglophone, je ne sais donc pas si squash est le meilleur mot. Existe-t-il un mot qui traduirait mieux l'idée de "ne devenir nul que s'il est vide"?