Cara terbaik yang bisa saya uraikan adalah mencari kode gagal yang saya coba sejauh ini:
case car
when ['honda', 'acura'].include?(car)
# code
when 'toyota' || 'lexus'
# code
end
Saya punya sekitar 4 atau 5 when
situasi berbeda yang harus dipicu oleh sekitar 50 nilai yang mungkin berbeda car
. Apakah ada cara untuk melakukan ini dengan case
blok atau haruskah saya mencoba if
blok besar ?
when "toyota", "lexus"
, saya mendapatkan:unexpected tSTRING_BEG, expecting keyword_do or '{' or '(' (SyntaxError)
. Namun, ketika saya menulis iniwhen "toyota","lexus"
:, berfungsi. Satu-satunya perbedaan adalah spasi setelah koma.or
atau di||
sini karenawhen
mengambil serangkaian ekspresi yang dipisahkan koma di sebelah kanannya, bukan pengidentifikasi tunggal. Karena ini, jika Anda punyawhen a or b
, tidak jelas apakah ini harus dianggap sama denganwhen a, b
atauwhen (a or b)
, yang terakhir mengevaluasi ekspresia or b
terlebih dahulu sebelum melemparkannya ke kapan. Ini lebih mengejutkan dan kurang mudah ditangani karena bahasa memiliki token yang mengubah perilaku berdasarkan konteks, dan kemudian Anda tidak akan dapat menggunakanor
ekspresi nyata di sisi kanan kapan.Anda bisa memanfaatkan "splat" ruby atau sintaks yang rata.
Ini membuat
when
klausa yang terlalu banyak - Anda memiliki sekitar 10 nilai untuk diuji per cabang jika saya mengerti dengan benar - sedikit lebih mudah dibaca menurut pendapat saya. Selain itu, Anda dapat mengubah nilai untuk menguji saat runtime. Sebagai contoh:Pendekatan umum lainnya adalah dengan menggunakan hash sebagai tabel pengiriman, dengan kunci untuk setiap nilai
car
dan nilai-nilai yang merupakan beberapa objek yang dapat dipanggil yang mengenkapsulasi kode yang ingin Anda jalankan.sumber
when
garis panjang . Terima kasih telah berbagi.Cara lain yang baik untuk menempatkan logika Anda dalam data adalah sesuatu seperti ini:
sumber