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.


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


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.


74

Satu baris jika:

<statement> if <condition>

Kasus Anda:

"Yes" if @item.rigged

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

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.


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"

hanya contoh kedua adalah ruby ​​idiomatik
sekmo

7

jika kondisi lain dapat ditutupi dengan operator ternary

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

2

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

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

1

Kamu bisa memakai ----

(@ item.rigged)? "Ya Tidak"

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.