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

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top