Bagaimana operator kondisional ( ? :
) digunakan di Ruby?
Misalnya, apakah ini benar?
<% question = question.size > 20 ? question.question.slice(0, 20)+"..." : question.question %>
ruby
ternary-operator
conditional-operator
Mithun Sreedharan
sumber
sumber
question=question[0,20]
Jika lebih kecil dari 20, itu tidak akan mengubahnya apa pun.Jawaban:
Ini adalah operator ternary , dan berfungsi seperti di C (tanda kurung tidak diperlukan). Itu ekspresi yang bekerja seperti:
Namun, di Ruby,
if
ada juga ekspresi:if a then b else c end
===a ? b : c
, kecuali untuk masalah prioritas. Keduanya adalah ekspresi.Contoh:
Perhatikan bahwa dalam kurung kasus pertama diperlukan (jika tidak, Ruby bingung karena menganggapnya
puts if 1
dengan beberapa sampah tambahan setelah itu), tetapi mereka tidak diperlukan dalam kasus terakhir karena masalah tersebut tidak muncul.Anda dapat menggunakan formulir "long-if" untuk keterbacaan pada beberapa baris:
sumber
nil
danfalse
. Memang tidak terlalu biasa.sumber
puts (true ? "true" : "false")
dengan tanda kurung. Kalau tidak, urutan operasi tidak jelas. Ketika saya pertama kali membaca ini saya bingung karena saya membacanya karena(puts true) ? "true" : "false"
kemudian diharapkanputs
untuk mengembalikan boolean yang kemudian menjadi nilai string.Penggunaan ERB Anda menunjukkan bahwa Anda berada di Rails. Jika demikian, pertimbangkanlah
truncate
, penolong bawaan yang akan melakukan pekerjaan untuk Anda:sumber
@pst memberikan jawaban yang bagus, tetapi saya ingin menyebutkan bahwa di Ruby operator ternary ditulis pada satu baris agar benar secara sintaksis, tidak seperti Perl dan C di mana kita dapat menulisnya di beberapa baris:
Biasanya Ruby akan memunculkan kesalahan jika Anda mencoba membaginya ke beberapa baris, tetapi Anda dapat menggunakan
\
simbol kelanjutan garis di akhir baris dan Ruby akan senang:Ini adalah contoh sederhana, tetapi bisa sangat berguna ketika berhadapan dengan garis yang lebih panjang karena membuat kode ditata dengan baik.
Dimungkinkan juga untuk menggunakan ternary tanpa karakter kelanjutan garis dengan menempatkan operator sebagai yang terakhir, tetapi saya tidak suka atau merekomendasikannya:
Saya pikir itu mengarah ke sangat sulit untuk membaca kode karena tes bersyarat dan / atau hasil menjadi lebih lama.
Saya sudah membaca komentar yang mengatakan tidak menggunakan operator ternary karena membingungkan, tetapi itu adalah alasan buruk untuk tidak menggunakan sesuatu. Dengan logika yang sama kita tidak boleh menggunakan ekspresi reguler, operator jangkauan ('
..
' dan variasi "flip-flop" yang tampaknya tidak dikenal). Mereka kuat ketika digunakan dengan benar, jadi kita harus belajar menggunakannya dengan benar.Pertimbangkan contoh OP:
Membungkus tes bersyarat membantu membuatnya lebih mudah dibaca karena memisahkan tes secara visual:
Tentu saja, seluruh contoh bisa dibuat lebih mudah dibaca dengan menggunakan beberapa tambahan spasi kosong. Ini belum diuji tetapi Anda akan mendapatkan ide:
Atau, lebih banyak menulis lebih idiomatis:
Akan mudah untuk berargumen bahwa keterbacaan juga sangat buruk
question.question
.sumber
true
?true
sebenarnya duduk untuk apa yang akan menjadi ekspresi yang mengevaluasitrue
ataufalse
. Lebih baik untuk membatasi secara visual karena pernyataan ternary dapat dengan cepat berubah menjadi noise visual, mengurangi keterbacaan yang memengaruhi pemeliharaan.Contoh sederhana di mana operator memeriksa apakah id pemain adalah 1 dan menetapkan id musuh tergantung pada hasilnya
Dan saya menemukan posting tentang topik yang tampaknya cukup membantu.
sumber
enemy_id = player_id == 1 ? 2 : 1
?Kode
condition ? statement_A : statement_B
ini setara dengansumber
Cara termudah:
karena
param_a
tidak sama denganparam_b
makaresult
nilai akan menjadiNot same!
sumber