Pernyataan Switch
Pernyataan switch adalah bentuk singkat untuk menulis serangkaian if yang membandingkan nilai yang sama. Perhatikan bahwa nilainya hanya dievaluasi sekali. Seperti if, switch bisa memiliki blok else untuk menangani tidak ada yang cocok. Perbandingan dilakukan dengan operator ==. Di dalam switch, Anda juga bisa memakai ekspresi assignment untuk menyimpan nilai variabel sementara.
switch name := "Dan" when "Robert" print "You are Robert" when "Dan", "Daniel" print "Your name, it's Dan" else print "I don't know about you with name #{name}"switch name := "Dan" when "Robert" print "You are Robert" when "Dan", "Daniel" print "Your name, it's Dan" else print "I don't know about you with name #{name}"Klausa when pada switch bisa mencocokkan beberapa nilai dengan menuliskannya dipisah koma.
Switch juga bisa dipakai sebagai ekspresi; di sini kita dapat menetapkan hasil switch ke sebuah variabel:
b = 1next_number = switch b when 1 2 when 2 3 else error "can't count that high!"b = 1next_number = switch b when 1 2 when 2 3 else error "can't count that high!"Kita bisa memakai kata kunci then untuk menulis blok when switch pada satu baris. Tidak ada kata kunci tambahan yang dibutuhkan untuk menulis blok else pada satu baris.
msg = switch math.random(1, 5) when 1 then "you are lucky" when 2 then "you are almost lucky" else "not so lucky"msg = switch math.random(1, 5) when 1 then "you are lucky" when 2 then "you are almost lucky" else "not so lucky"Jika Anda ingin menulis kode dengan satu indentasi lebih sedikit saat menulis switch, Anda bisa menaruh klausa when pertama pada baris awal pernyataan, lalu semua klausa lain dapat ditulis dengan satu indentasi lebih sedikit.
switch math.random(1, 5) when 1 print "you are lucky" -- two indents else print "not so lucky"
switch math.random(1, 5) when 1 print "you are lucky" -- one indentelse print "not so lucky"switch math.random(1, 5) when 1 print "you are lucky" -- two indents else print "not so lucky"
switch math.random(1, 5) when 1 print "you are lucky" -- one indentelse print "not so lucky"Perlu dicatat urutan ekspresi perbandingan kasus. Ekspresi kasus berada di sisi kiri. Ini bisa berguna jika ekspresi kasus ingin mengganti cara perbandingan dengan mendefinisikan metamethod eq.
Pencocokan Tabel
Section titled “Pencocokan Tabel”Anda bisa melakukan pencocokan tabel dalam klausa when switch, jika tabel dapat didestrukturisasi oleh struktur tertentu dan mendapatkan nilai non-nil.
items = * x: 100 y: 200 * width: 300 height: 400
for item in *items switch item when :x, :y print "Vec2 #{x}, #{y}" when :width, :height print "size #{width}, #{height}"items = * x: 100 y: 200 * width: 300 height: 400
for item in *items switch item when :x, :y print "Vec2 #{x}, #{y}" when :width, :height print "size #{width}, #{height}"Anda dapat menggunakan nilai default untuk mendestrukturisasi tabel secara opsional pada beberapa field.
item = {}
{pos: {:x = 50, :y = 200}} = item -- get error: attempt to index a nil value (field 'pos')
switch item when {pos: {:x = 50, :y = 200}} print "Vec2 #{x}, #{y}" -- table destructuring will still passitem = {}
{pos: {:x = 50, :y = 200}} = item -- get error: attempt to index a nil value (field 'pos')
switch item when {pos: {:x = 50, :y = 200}} print "Vec2 #{x}, #{y}" -- table destructuring will still passAnda juga bisa mencocokkan elemen array, field tabel, dan bahkan struktur bertingkat dengan literal array atau tabel.
Cocokkan terhadap elemen array.
switch tb when [1, 2, 3] print "1, 2, 3" when [1, b, 3] print "1, #{b}, 3" when [1, 2, b = 3] -- b has a default value print "1, 2, #{b}"switch tb when [1, 2, 3] print "1, 2, 3" when [1, b, 3] print "1, #{b}, 3" when [1, 2, b = 3] -- b has a default value print "1, 2, #{b}"Cocokkan terhadap field tabel dengan destrukturisasi.
switch tb when success: true, :result print "success", result when success: false print "failed", result else print "invalid"switch tb when success: true, :result print "success", result when success: false print "failed", result else print "invalid"Cocokkan terhadap struktur tabel bertingkat.
switch tb when data: {type: "success", :content} print "success", content when data: {type: "error", :content} print "failed", content else print "invalid"switch tb when data: {type: "success", :content} print "success", content when data: {type: "error", :content} print "failed", content else print "invalid"Cocokkan terhadap array dari tabel.
switch tb when [ {a: 1, b: 2} {a: 3, b: 4} {a: 5, b: 6} fourth ] print "matched", fourthswitch tb when [ {a: 1, b: 2} {a: 3, b: 4} {a: 5, b: 6} fourth ] print "matched", fourthCocokkan terhadap daftar dan tangkap rentang elemen.
segments = ["admin", "users", "logs", "view"]switch segments when [...groups, resource, action] print "Group:", groups -- prints: {"admin", "users"} print "Resource:", resource -- prints: "logs" print "Action:", action -- prints: "view"segments = ["admin", "users", "logs", "view"]switch segments when [...groups, resource, action] print "Group:", groups -- prints: {"admin", "users"} print "Resource:", resource -- prints: "logs" print "Action:", action -- prints: "view"