Eine Zeile, wenn die Anweisung nicht funktioniert

191
<%if @item.rigged %>Yes<%else%>No<%end%>

Ich habe an so etwas gedacht?

if @item.rigged ? "Yes" : "No" 

Aber es funktioniert nicht. Ruby hat das, ||=aber ich bin mir nicht mal sicher, wie ich das Ding benutzen soll.

RoR
quelle
Es ist unklar, welche Leitung nicht funktioniert (oder ist es beides?)
Ymoreau

Antworten:

399

Entfernen ifvonif @item.rigged ? "Yes" : "No"

Ternärer Operator hat Form condition ? if_true : if_false

Nikita Rybak
quelle
1
Wenn Ihre Bedingung mit einem '?' ist es möglich, es fallen zu lassen? Dh wenn die Bedingung @ customer.sales.present ist? Kannst du das '?' fallen lassen? ... mach dir keine Sorgen. Ich habe einen Code gefunden und getestet. Die Antwort ist "nein"
Jay Killeen
@ JayKilleen Du hast recht. Ruby dreht sich alles um clevere Tricks, aber es ist so clever (:
Nikita Rybak
1
@ NikitaRybak s/that/not that :)
Austin
180

In Ruby müssen die Bedingung und der thenTeil eines ifAusdrucks entweder durch ein Ausdruckstrennzeichen (dh ;oder eine neue Zeile) oder das thenSchlüsselwort getrennt werden.

All dies würde also funktionieren:

if @item.rigged then 'Yes' else 'No' end

if @item.rigged; 'Yes' else 'No' end

if @item.rigged
  'Yes' else 'No' end

Es gibt auch einen bedingten Operator in Ruby, aber das ist völlig unnötig. Der Bedingungsoperator ist in C benötigt, weil es ein Operator ist: in C, ifist eine Aussage , und somit keinen Wert zurückgeben kann, wenn Sie also einen Wert zurückgeben möchten, müssen Sie etwas verwenden , das kann einen Wert zurückgeben. Und die einzigen Dinge in C, die einen Wert zurückgeben können, sind Funktionen und Operatoren. Da es unmöglich ist, ifeine Funktion in C zu erstellen, benötigen Sie einen Operator.

In Ruby ist jedoch ifein Ausdruck. Tatsächlich ist alles ein Ausdruck in Ruby, sodass bereits ein Wert zurückgegeben werden kann. Es ist nicht erforderlich, dass der bedingte Operator überhaupt existiert , geschweige denn verwendet wird.

Übrigens: Es ist üblich, Methoden zu benennen, mit denen eine Frage mit einem Fragezeichen am Ende wie folgt gestellt wird:

@item.rigged?

Dies zeigt ein weiteres Problem bei der Verwendung des bedingten Operators in Ruby:

@item.rigged? ? 'Yes' : 'No'

Es ist einfach schwer zu lesen, wenn mehrere Fragezeichen nahe beieinander liegen.

Jörg W Mittag
quelle
74

Eine Zeile, wenn:

<statement> if <condition>

Dein Fall:

"Yes" if @item.rigged

"No" if !@item.rigged # or: "No" unless @item.rigged
Bakir Jusufbegovic
quelle
14
Oder "No" unless @item.riggedum das zu verhindern!
Veger
Diese Lösung unterscheidet sich darin, dass sie nilanstelle von 'Yes'if item.riggedtrue zurückgibt . Einzeilige if- oder if-Anweisungen werden zurückgegeben, nilwenn die Bedingung nicht erfüllt ist.
Der Pellmeister
23

Von dem was ich weiß

3 Einzeiler

  1. a = 10 if <condition>

Beispiel:

a = 10 if true # a = 10
b = 10 if false # b = nil
  1. a = 10 unless <condition>

Beispiel:

a = 10 unless false # a = 10
b = 10 unless true # b = nil
  1. a = <condition> ? <a> : <b>

Beispiel:

a = true ? 10 : 100 # a = 10
a = false ? 10 : 100 # a = 100

Ich hoffe, es hilft.

Alan Dong
quelle
2
Hund Dies ist die beste Antwort - ich liebe es, wie prägnant es alle drei Arten kontrastiert. Vielen Dank!
MrVocabulary
7

Sowohl die Shell- als auch die C-Einzeilenkonstrukte funktionieren (Ruby 1.9.3p429):

# Shell format
irb(main):022:0> true && "Yes" || "No"
=> "Yes"
irb(main):023:0> false && "Yes" || "No"
=> "No"

# C format
irb(main):024:0> true ? "Yes" : "No"
=> "Yes"
irb(main):025:0> false ? "Yes" : "No"
=> "No"
Kennzeichen
quelle
nur das zweite Beispiel ist idiomatischer Rubin
Sekmo
7

Andernfalls kann der Zustand mit einem ternären Bediener abgedeckt werden

@item.rigged? ? 'Yes' : 'No'
Nitanshu Verma
quelle
2

Der Einfachheit halber können Sie Folgendes verwenden, wenn Sie standardmäßig einen Wert von Null verwenden müssen:

@something.nil? = "No" || "Yes"
aabiro
quelle
1

Sie können verwenden ----

(@ item.rigged)? "Ja Nein"

Wenn @ item.rigged wahr ist, wird "Ja" zurückgegeben, andernfalls wird "Nein" zurückgegeben.

Snm Maurya
quelle