web-dev-qa-db-fra.com

Ruby if .. elsIf .. else sur une seule ligne?

Avec l'opérateur Ruby ternaire, nous pouvons écrire la logique suivante pour une construction simple if else:

a = true  ? 'a' : 'b' #=> "a"

Mais si je voulais écrire ceci comme if foo 'a' elsif bar 'b' else 'c'?

Je pourrais l'écrire comme suit, mais c'est un peu difficile à suivre:

foo = true
a = foo  ? 'a' : (bar ? 'b' : 'c') #=> "a"

foo = false
bar = true
a = foo  ? 'a' : (bar ? 'b' : 'c') #=> "b"

Existe-t-il de meilleures options pour gérer un tel scénario ou est-ce notre meilleur choix si nous souhaitons condenser la logique if..elsif..else en une seule ligne?

23
Noz
a = (foo && "a" or bar && "b" or "c")

ou

a = ("a" if foo) || ("b" if bar) || "c"
44
sawa

Le Github Ruby Styleguide recommande que l'un des liners soit réservé pour les instructions triviales if/else et que les opérateurs ternaires imbriqués soient évités. Vous pouvez utiliser le then mot clé, mais son considéré comme une mauvaise pratique.

if foo then 'a' elsif bar then 'b' else 'c' end

Vous pouvez utiliser des cas (opérateur de commutateur Ruby) si vous trouvez vos instructions de contrôle trop complexes.

16
sunnyrjuneja

a = if foo then 'a' elsif bar then 'b' else 'c' end

5
tjmw

Vous pouvez également écrire:

x = if foo then 'a' elsif bar then 'b' else 'c' end

Cependant, ce formatage n'est pas idiomatique dans Ruby.

3
tokland