2012-12-12 6 views
21

Mit dem rubin ternären Operator wir die folgenden Logik für ein einfaches, wenn anderes Konstrukt schreiben:Ruby if .. elsIf .. sonst in einer einzigen Zeile?

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

Aber was, wenn ich dies als if foo 'a' elsif bar 'b' else 'c' schreiben wollte? Gibt es bessere Möglichkeiten für den Umgang mit, ein solches Szenario oder ist dies unsere beste Wette

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

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

wenn wir, wenn kondensieren wollen:

ich es als die folgende schreiben könnte, aber es ist ein wenig schwierig zu folgen. .elsif..elogic in eine einzige Zeile?

+3

Ich denke, das Problem mit der mangelnden Lesbarkeit in der verschachtelten ternären Lösung ist, dass alles in einer Zeile zu schreiben ist inhärent schwierig zu lesen, und keine der Lösungen, die Sie kommen mit wird viel einfacher zu analysieren. –

+5

In anderen Worten, mit mehr Erfahrung werden Sie lernen, dass das Komprimieren von so viel Code wie möglich in einem kleinen Raum niemals ein gültiges Ziel ist. –

+3

"so viel Code wie möglich in einen kleinen Raum zu drücken, ist niemals ein gültiges Ziel." außer im Maschinencode. –

Antwort

43
a = (foo && "a" or bar && "b" or "c") 

oder

a = ("a" if foo) || ("b" if bar) || "c" 
+1

Interesse Antwort, Sawa. Ist das "oder" ein Vorzug als Trick? – sunnyrjuneja

+2

'oder' und' und' haben eine geringere Assoziativität als '&&' und '||'. – sawa

+2

Ich liebe dieses ... 'und' und 'oder' sind Freunde, solange Sie Vorrang lernen, was jeder sollte. –

3

Sie können auch schreiben:

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

Dies ist jedoch in Ruby nicht idiomatischen Formatierung ist.

5

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

12

Die Github Ruby Styleguide empfiehlt, dass ein Liner für trivial reserviert werden, wenn/else-Anweisungen und die verschachtelten ternären Operatoren vermieden werden. Sie könnten das Schlüsselwort then verwenden, aber es gilt als schlechte Praxis.

Sie könnten Fälle (Ruby's switch operator) verwenden, wenn Ihre Steueranweisungen zu komplex sind.

+1

'wenn foo dann‚a‘elsif bar dann‚b‘else‚c'' keine Notwendigkeit für das Semikolon nach bar – UsamaMan

+0

danke für die Anregung, editting es entfernen jetzt – sunnyrjuneja

+1

vergessen I 'Ende 'nach' c'. Das müssen wir auch hinzufügen. – UsamaMan

Verwandte Themen