8
votes

Assécher rubis ternaire

J'ai souvent une situation où je veux faire une logique conditionnelle, puis retourner une partie de la condition. Comment puis-je faire cela sans répéter la partie de la condition dans l'expression vraie ou fausse?

Par exemple: P>

PROFESSIONAL_ROLES.key(self.professional_role).nil? ? 
    948460516 : PROFESSIONAL_ROLES.key(self.professional_role)


1 commentaires

Sec est l'une de ces choses qui a beaucoup de sens lorsque vous répétez des blocs de code ou de longues séquences de méthodes chaînées ou de faire quelque chose que la répétition pourrait réduire votre qualité de code de la manière. Je ne pense pas que cela a du sens quand vous faites quelque chose de simple et que vous devez sauter à travers un cerceau pour devenir sèche. Nous pouvons facilement vous séduire dans la poursuite du dragon sec et perdre une trace de «assez bon». Dans votre exemple, si vous allez en boucle, des millions de fois, ajoutez une variable TEMP ou faire le || THY SEPP2K, sinon, ne vous inquiétez pas trop.


3 Réponses :


10
votes

supposer que vous allez bien avec false étant traité de la même manière que nil , vous utilisez || : xxx

Ceci retournera 948460516 Si clé retourne nil ou false et la valeur de retour de l'appel à clé sinon.

Notez que cela ne renvoie que 948460516 si clé renvoie nil ou false , pas si cela renvoie un tableau vide ou une chaîne. Depuis que vous avez utilisé nil? dans votre deuxième exemple, je suppose que ça va. Cependant, vous avez utilisé vide? dans le premier exemple (et vide? renvoie vrai pour des tableaux et des chaînes vides), donc je ne suis pas sûr.


0 commentaires

0
votes

Je sais que cela ne semble pas trop jolie, mais cela fait des choses un peu de sèche-linge. XXX

Si vous ne souhaitez pas créer TEMP variable Pour une raison quelconque, vous pouvez réutiliser quelque chose qui existe déjà comme $ _ .


0 commentaires

2
votes

Si vous voulez juste sécher, vous pouvez utiliser une variable TEMP:

def x_or_default(x, defval, checker = :nil?)
  if x.send(checker) then defval else x end
end
x_or_default(ClassName.method, false, :blank?)
x_or_default(PROFESSIONAL_ROLES.key(self.professional_role), 94840516)


0 commentaires