Satu baris jika pernyataan tidak berfungsi

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

Saya sedang memikirkan sesuatu seperti ini?

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

Tapi itu tidak berhasil. Ruby memiliki ||=tetapi saya bahkan tidak yakin bagaimana cara menggunakannya.

RoR
sumber
Tidak jelas baris mana yang tidak berfungsi (atau keduanya?)
ymoreau

Jawaban:

399

Hapus ifdariif @item.rigged ? "Yes" : "No"

Operator ternary memiliki formulir condition ? if_true : if_false

Nikita Rybak
sumber
1
Jika kondisi Anda diakhiri dengan '?' apakah mungkin untuk menjatuhkannya? Yaitu jika kondisinya adalah @ customer.sales.present? bisakah kamu menjatuhkan '?' ... jangan khawatir. Menemukan beberapa kode yang saya miliki dan mengujinya. Jawabannya adalah 'tidak'
Jay Killeen
@ JayKilleen Anda benar. Ruby adalah semua tentang trik pintar, tapi itu yang pintar (:
Nikita Rybak
1
@NikitaRybak s/that/not that :)
Austin
180

Di Ruby, kondisi dan thenbagian dari ifekspresi harus dipisahkan oleh pemisah ekspresi (yaitu ;atau baris baru) atau thenkata kunci.

Jadi, semua ini akan berhasil:

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

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

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

Ada juga operator kondisional di Ruby, tetapi itu sama sekali tidak perlu. Operator bersyarat diperlukan dalam C, karena itu adalah operator: dalam C, ifadalah pernyataan dan dengan demikian tidak dapat mengembalikan nilai, jadi jika Anda ingin mengembalikan nilai, Anda perlu menggunakan sesuatu yang dapat mengembalikan nilai. Dan satu-satunya hal dalam C yang dapat mengembalikan nilai adalah fungsi dan operator, dan karena tidak mungkin untuk membuat iffungsi di C, Anda memerlukan operator.

Di Ruby, bagaimanapun, ifadalah sebuah ekspresi. Faktanya, semuanya adalah ekspresi di Ruby, sehingga sudah dapat mengembalikan nilai. Bahkan operator kondisional tidak perlu ada , apalagi menggunakannya.

BTW: sudah biasa menyebutkan metode yang digunakan untuk mengajukan pertanyaan dengan tanda tanya di akhir, seperti ini:

@item.rigged?

Ini menunjukkan masalah lain dengan menggunakan operator kondisional di Ruby:

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

Sangat sulit untuk membaca dengan beberapa tanda tanya yang dekat satu sama lain.

Jörg W Mittag
sumber
74

Satu baris jika:

<statement> if <condition>

Kasus Anda:

"Yes" if @item.rigged

"No" if !@item.rigged # or: "No" unless @item.rigged
Bakir Jusufbegovic
sumber
14
Atau "No" unless @item.riggeduntuk mencegah!
Veger
Solusi ini berbeda karena ia mengembalikan nilbukan 'Yes'jika item.riggedbenar. Baris tunggal jika atau kecuali pernyataan kembali niljika kondisinya tidak terpenuhi.
The Pellmeister
23

Dari yang aku tahu

3 satu baris

  1. a = 10 if <condition>

contoh:

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

contoh:

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

contoh:

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

Saya harap ini membantu.

Alan Dong
sumber
2
Anjing Ini adalah jawaban terbaik - Saya suka betapa ringkasnya kontras semua tiga cara. Terima kasih!
MrVocabulary
7

Konstruksi shell dan C one-line berfungsi (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"
menandai
sumber
hanya contoh kedua adalah ruby ​​idiomatik
sekmo
7

jika kondisi lain dapat ditutupi dengan operator ternary

@item.rigged? ? 'Yes' : 'No'
nitanshu verma
sumber
2

Untuk kesederhanaan, Jika Anda perlu default ke beberapa nilai jika nil Anda dapat menggunakan:

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

Kamu bisa memakai ----

(@ item.rigged)? "Ya Tidak"

Jika @ item.rigged benar, ia akan mengembalikan 'Ya' jika tidak maka akan kembali 'Tidak'

Snm Maurya
sumber