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.


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


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.


74

Eine Zeile, wenn:

<statement> if <condition>

Dein Fall:

"Yes" if @item.rigged

"No" if !@item.rigged # or: "No" unless @item.rigged

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.


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"

nur das zweite Beispiel ist idiomatischer Rubin
Sekmo

7

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

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

2

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

@something.nil? = "No" || "Yes"

1

Sie können verwenden ----

(@ item.rigged)? "Ja Nein"

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.