Jedna linia, jeśli instrukcja nie działa

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

Myślałem o czymś takim?

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

Ale to nie działa. Ruby ma, ||=ale nie jestem nawet pewna, jak tego użyć.

RoR
źródło
Nie jest jasne, która linia nie działa (a może obie?)
ymoreau

Odpowiedzi:

399

Usuń ifzif @item.rigged ? "Yes" : "No"

Operator trójskładnikowy ma formę condition ? if_true : if_false

Nikita Rybak
źródło
1
Jeśli warunek kończy się na „?” czy można to upuścić? To znaczy, czy warunek to @ customer.sales.present? czy możesz upuścić „?”? ... nie martw się. Znalazłem kod, który miałem i przetestowałem. Odpowiedź brzmi „nie”
Jay Killeen
@JayKilleen Masz rację. W Ruby chodzi o sprytne sztuczki, ale takie sprytne (:
Nikita Rybak,
1
@NikitaRybak s/that/not that :)
Austin
180

W Ruby warunek i thenczęść ifwyrażenia muszą być oddzielone separatorem wyrażeń (tj. ;Lub znakiem nowej linii) lub thensłowem kluczowym.

Wszystko to działałoby:

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

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

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

W Rubim istnieje również operator warunkowy, ale jest to całkowicie niepotrzebne. Operator warunkowy jest potrzebny w C, ponieważ jest operatorem: w C ifjest instrukcją i dlatego nie może zwrócić wartości, więc jeśli chcesz zwrócić wartość, musisz użyć czegoś, co może zwrócić wartość. A jedynymi rzeczami w C, które mogą zwrócić wartość, są funkcje i operatory, a ponieważ niemożliwe jest utworzenie iffunkcji w C, potrzebujesz operatora.

W Ruby ifjest jednak wyrażenie. W rzeczywistości wszystko jest wyrażeniem w Rubim, więc może już zwrócić wartość. Operator warunkowy nie musi nawet istnieć , a tym bardziej go używać.

BTW: zwyczajowo nazywa się metody stosowane do zadawania pytań ze znakiem zapytania na końcu, takie jak:

@item.rigged?

To pokazuje kolejny problem z użyciem operatora warunkowego w Rubim:

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

Po prostu trudno jest go odczytać za pomocą wielu sąsiadujących ze sobą znaków zapytania.

Jörg W Mittag
źródło
74

Jedna linia, jeśli:

<statement> if <condition>

Twój przypadek:

"Yes" if @item.rigged

"No" if !@item.rigged # or: "No" unless @item.rigged
Bakir Jusufbegovic
źródło
14
Lub, "No" unless @item.riggedaby zapobiec!
Veger
To rozwiązanie różni się tym, że zwraca nilzamiast 'Yes'if item.riggedjest prawdziwe. Jednowierszowe, jeśli lub jeśli instrukcje nie zwracają, niljeśli warunek nie jest spełniony.
The Pellmeister
23

Z tego co wiem

3 jednowarstwowe

  1. a = 10 if <condition>

przykład:

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

przykład:

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

przykład:

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

Mam nadzieję, że to pomoże.

Alan Dong
źródło
2
Pies To najlepsza odpowiedź - uwielbiam, jak zwięźle kontrastuje na wszystkie trzy sposoby. Dzięki!
MrVocabulary
7

Działa zarówno konstrukcja jednowierszowa powłoki, jak i C (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"
znak
źródło
tylko drugim przykładem jest idiomatyczny rubin
sekmo
7

w przeciwnym razie warunek można pokryć operatorem trójskładnikowym

@item.rigged? ? 'Yes' : 'No'
nitanshu verma
źródło
2

Dla uproszczenia: Jeśli potrzebujesz domyślnej wartości, jeśli zero, możesz użyć:

@something.nil? = "No" || "Yes"
aabiro
źródło
1

Możesz użyć ----

(@ item.rigged)? "Tak nie"

Jeśli @ item.rigged jest prawdziwe, zwróci „Tak”, w przeciwnym razie zwróci „Nie”

Snm Maurya
źródło