Gibt es eine Rubinsprache für "If do-this" und "do-this" nur als einfachen Befehl?
Zum Beispiel mache ich gerade
object.method ? a.action : nil
um die else-Klausel leer zu lassen, aber ich denke, es gibt wahrscheinlich einen idiomatischeren Weg, dies zu tun, bei dem am Ende keine Null angegeben werden muss. (und alternativ denke ich, dass es in diesem Fall verschwenderisch wäre, mehrere Codezeilen zu verwenden.
ruby
operators
conditional
conditional-operator
RyanCacophony
quelle
quelle
Antworten:
a.action if object.method?
quelle
In der Regel: Sie benötigen den ternären Operator in Ruby so gut wie nie. Der Grund , warum Sie es in C benötigen, liegt daran , dass in C ist
if
eine Aussage, wenn Sie also einen Wert , den Sie zurückkehren wollen haben den ternären Operator zu verwenden, was ein Ausdruck ist.In Ruby ist alles ein Ausdruck, es gibt keine Anweisungen, was den ternären Operator ziemlich überflüssig macht. Sie können jederzeit ersetzen
mit
if cond then then_branch else else_branch end
Also, in Ihrem Beispiel:
object.method ? a.action : nil
ist äquivalent zu
if object.method then a.action end
was, wie @Greg Campbell betont, wiederum der nachfolgenden
if
Modifikatorform entsprichta.action if object.method
Da die booleschen Operatoren in Ruby nicht nur
true
oderfalse
, sondern den Wert des zuletzt ausgewerteten Ausdrucks zurückgeben, können Sie sie auch für den Steuerungsfluss verwenden. Dies ist eine aus Perl importierte Redewendung, die folgendermaßen aussehen würde:object.method and a.action
quelle
cond ? a : b
ist kürzer alsif cond then a else b end
, das allein bringt mich dazu, 11 Zeichen zu sparen ;-)?:
) gegenüberif/then/else/end
Konstrukten. Er ist häufiger und offensichtlich prägnanter."Gregs Antwort ist die beste, aber für die Aufzeichnung und noch mehr als in C sind Ausdrücke und Aussagen in Ruby gleichwertig, sodass
a.action if o.m?
Sie außerdem Dinge tun können wie:Du kannst schreiben
(a; b; c) if d
oder sogar(a b c ) if d
oder für diese Angelegenheit:
(x; y; z) ? (a; b c) : (d; e; f)
In Ruby gibt es keine Situation, in der nur eine einzige Anweisung oder ein Ausdruck zulässig ist ...
quelle
result = (<expression> && <true value>) || <false value>
value = 1 result = (value == 1 && 'one' ) || 'two' result #=> 'one'
Erklären Sie: value == 1 && 'one' # => gibt das Ergebnis des letzten Ausdrucks zurück, value ist gleich 1, und der Abschnitt wird ausgewertet und 'one' zurückgegeben.value = 0 result = (value == 1 && 'one' ) || 'two' result #=> 'two'
Erklären Sie: value! = 1 und 'und' Ausdruck werden nicht ausgewertet, aber instad wird verwendet 'oder' Ausdruck und es wird 'zwei' zurückgegeben.
quelle
Eine andere Möglichkeit, dies in derselben Zeile zu tun, ist:
if object.method; a.action end
Dies wird von Rubocop als schlechter Stil angesehen, da es ein Semikolon verwendet, um den Ausdruck zu beenden, aber ich finde es unter bestimmten Bedingungen besser lesbar, als die if-Anweisung am Ende anzuheften. Es ist einfacher, eine if-Anweisung am Ende zu übersehen, und ich möchte nicht immer etwas zurückgeben, wenn die Bedingung nicht erfüllt ist (da Sie mit einem ternären Operator dazu gezwungen werden).
Sie können auch etwas ausführlicher und rubocop-freundlicher sein:
if object.method then a.action end
quelle