İfade çalışmıyorsa bir satır


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

Böyle bir şey mi düşünüyordum?

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

Ama işe yaramıyor. Ruby var ||=ama bu şeyi nasıl kullanacağımdan bile emin değilim.


Hangi hattın çalışmadığı belli değil (ya da her ikisi de mi?)
ymoreau

Yanıtlar:


401

Kaldır ifdanif @item.rigged ? "Yes" : "No"

Üçlü operatör formu var condition ? if_true : if_false


1
Eğer koşulu bir '?' düşürmek mümkün mü? Yani eğer koşul @ customer.sales.present ise? '' '' bırakabilir misin? ... endişelenme. Ben vardı bazı kod bulundu ve test. Cevap 'hayır'
Jay Killeen

@JayKilleen Haklısın. Ruby akıllıca hileler hakkında, ama o kadar akıllı (:
Nikita Rybak

1
@NikitaRybak s/that/not that :)
Austin

180

Ruby'de, thenbir ififadenin koşulu ve kısmı bir ifade ayırıcısı (yani ;veya bir yeni satır) veya thenanahtar kelime ile ayrılmalıdır .

Yani, bunların hepsi işe yarayacaktı:

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

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

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

Ruby'de şartlı bir operatör de var, ancak bu tamamen gereksiz. C: o bir operatör olduğu için koşullu operatör, C gereklidir if, bir değer döndüremez dolayısıyla bir ifadedir ve böylece bir değer döndürmek istiyorsanız, bir şey kullanmaya gerek olabilir bir değeri döndürür. Ve C'de bir değer döndürebilen tek şey işlevler ve operatörlerdir ve ifC'de bir işlev yapmak imkansız olduğu için bir operatöre ihtiyacınız vardır.

Ancak Ruby'de ifbir ifade var. Aslında, her şey Ruby'deki bir ifadedir, bu yüzden zaten bir değer döndürebilir. Koşullu operatörün , kullanmasına izin vermeksizin , var olmasına bile gerek yoktur .

BTW: Sonunda soru işareti olan bir soru sormak için kullanılan yöntemleri şöyle adlandırmak gelenekseldir:

@item.rigged?

Bu, Ruby'de koşullu işleci kullanma ile ilgili başka bir sorunu gösterir:

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

Birbirine yakın çok sayıda soru işaretiyle okumak zor.


74

Aşağıdaki durumlarda bir satır:

<statement> if <condition>

Senin durumun:

"Yes" if @item.rigged

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

14
Ya "No" unless @item.riggedda önlemek için!
Veger

Bu çözüm , true ise nilyerine döndürdüğü için farklıdır . Koşul karşılanmadığında ifadeler geri dönerse veya dönmezse tek satır . 'Yes'item.riggednil
Pellmeister

23

Bildiğim kadarıyla

3 tek katlı

  1. a = 10 if <condition>

misal:

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

misal:

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

misal:

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

Umut ediyorum bu yardım eder.


2
Köpek Bu en iyi cevaptır - üç yolun ne kadar özdeş olduğunu seviyorum. Teşekkürler!
MrVocabulary

7

Hem kabuk hem de C tek hat yapıları çalışır (yakut 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"

sadece ikinci örnek deyimsel yakut
sekmo

7

başka koşul üçlü operatörle karşılanabiliyorsa

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

2

Basitlik için, nil varsa bazı değerlere varsayılan olarak ihtiyacınız varsa:

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

1

Kullanabilirsiniz ----

(@ item.rigged)? "Evet Hayır"

@ İtem.rigged doğru ise, 'Evet' döndürür, aksi takdirde 'Hayır' döndürür

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.