Tutorial Pasukan Lucee MY

Gelung dan Kondisional dalam CFML: cfloop, cfif dan switch

Belajar gelung dan kondisional CFML di Lucee: cfloop, for loop, cfif, cfelse, switch, break dan continue. Contoh praktikal menyusun senarai dan menapis data.

Gelung dan Kondisional dalam CFML: cfloop, cfif dan switch
0
Kandungan

Gelung dan Kondisional dalam CFML: cfloop, cfif dan switch

Gelung dan kondisional ialah struktur kawalan yang menentukan aliran kod anda. Dalam CFML, kondisional dikendalikan oleh cfif dan cfswitch, manakala gelung ditulis dengan cfloop dalam gaya tag atau for, for-in dan while dalam gaya skrip. Artikel ini menunjukkan kedua-dua bentuk berserta contoh praktikal, supaya anda boleh memilih gaya yang paling sesuai untuk projek Lucee anda.

Kondisional: cfif, cfelseif dan cfelse

cfif membolehkan anda membina syarat mudah dan bersarang. Ia digunakan bersama cfelseif dan cfelse, dan nilai di dalam tag boleh berupa sebarang ungkapan. Bentuk tag kelihatan seperti ini:

<cfset markah = 78>
<cfif markah gte 80>
    <cfoutput>Gred A</cfoutput>
<cfelseif markah gte 60>
    <cfoutput>Gred B</cfoutput>
<cfelse>
    <cfoutput>Gred C</cfoutput>
</cfif>

Bentuk skripnya lebih ringkas dan menjadi pilihan kebanyakan pembangun moden:

markah = 78;
if (markah >= 80) {
    writeOutput("Gred A");
} else if (markah >= 60) {
    writeOutput("Gred B");
} else {
    writeOutput("Gred C");
}

Untuk syarat satu baris, sintaks skrip menyediakan operator ternary dan Elvis. Ternary memilih satu daripada dua nilai, manakala Elvis memulangkan nilai lalai apabila ungkapan di sebelah kiri kosong. Kedua-duanya menjimatkan baris tanpa mengorbankan kebolehbacaan.

switch dan cfswitch

Apabila anda membandingkan satu nilai dengan banyak kemungkinan, switch lebih kemas daripada rantaian if yang panjang. Lucee menyokong cfswitch dengan cfcase dan cfdefaultcase dalam gaya tag, serta switch dan case dalam gaya skrip. Satu perbezaan penting yang dirakam dalam dokumentasi: cfcase tidak jatuh terus ke kes berikutnya, jadi tiada break diperlukan, manakala switch skrip mengikut semantik gaya C yang jatuh terus melainkan anda menulis break.

switch (hari) {
    case "Isnin":
        label = "Hari bekerja";
        break;
    case "Sabtu":
    case "Ahad":
        label = "Hujung minggu";
        break;
    default:
        label = "Tidak diketahui";
}

Dalam bentuk tag, anda menulis cfswitch dengan atribut expression dan menyenaraikan cfcase bagi setiap nilai. cfdefaultcase menerima kawalan apabila tiada nilai yang sepadan. Gunakan gaya skrip untuk logik padat, dan gaya tag apabila anda bekerja dalam templat paparan. Perbandingan penuh kedua-dua gaya ada dalam perbezaan gaya tag dan skrip.

Gelung skrip: for, for-in dan while

Sintaks skrip CFML menyediakan gelung yang anda kenali daripada bahasa lain. Gelung for dengan indeks sesuai apabila anda perlu nombor kaunter:

for (i = 1; i <= 5; i++) {
    writeOutput("Nombor #i#<br>");
}

Gelung for-in mengulang terus atas tatasusunan tanpa perlu mengurus indeks secara manual. Ia juga berfungsi atas struktur dan atas objek query, menjadikan kod lebih bersih:

buah = ["epal", "pisang", "mangga"];
for (b in buah) {
    writeOutput(b);
}

for (baris in qPengguna) {
    writeOutput(baris.nama);
}

Gelung while menyemak syarat sebelum setiap lelaran, manakala do-while menjalankan badan sekurang-kurangnya sekali sebelum menyemak. Pilih do-while apabila anda perlu memproses input sekurang-kurangnya satu pusingan.

cfloop dalam gaya tag

cfloop ialah padanan gelung dalam gaya tag, dan dokumentasi Lucee menyenaraikan beberapa jenis gelung yang disokong: indeks dengan from, to dan step, senarai dengan list dan delimiters, tatasusunan dengan array, struktur dengan collection atau struct, query dengan atribut query, dan gelung times untuk bilangan ulangan tetap.

<cfloop from="1" to="5" index="i">
    <cfoutput>Nombor #i#</cfoutput>
</cfloop>

<cfloop array="#buah#" item="b">
    <cfoutput>#b#</cfoutput>
</cfloop>

<cfloop query="qPengguna">
    <cfoutput>#qPengguna.nama#</cfoutput>
</cfloop>

Satu perkara yang patut diketahui: cfloop juga disokong di dalam cfscript, jadi anda boleh mencampur gaya mengikut keperluan. Walau bagaimanapun, kebanyakan kod baharu lebih mudah dibaca dengan gelung skrip tulen, dan cfloop disimpan untuk templat paparan.

Gelung atas struct dan query

Apabila mengulang struktur, atribut collection memberi anda kunci, dan item memberi anda nilai. Ini berguna untuk senarai tetapan atau metadata. Untuk query, anda boleh mengehadkan baris dengan startRow dan endRow tanpa memuatkan semula data. Menapis hasil query dengan gelung ialah pola biasa, dan jika penapisan itu sendiri boleh dilakukan dalam SQL, bandingkan dengan panduan cfquery dan cfqueryparam dan query of queries.

break dan continue

break menamatkan gelung serta-merta, manakala continue melompat ke lelaran seterusnya. Dalam gaya tag, ini ialah cfbreak dan cfcontinue, dan kedua-duanya menerima atribut label untuk menyasar gelung tertentu dan bukannya gelung terdekat. Sintaks skrip menyokong break dan continue dengan label bernama juga.

for (i = 1; i <= 100; i++) {
    if (i == 50) {
        break;      // berhenti terus
    }
    if (i mod 2 == 0) {
        continue;   // langkau nombor genap
    }
    writeOutput(i);
}

Ambil perhatian terhadap perangkap yang didokumenkan: cfbreak yang diletakkan di dalam cfcase yang berada di dalam cfloop akan menamatkan gelung luar, bukan switch. Dalam switch skrip pula, break hanya keluar daripada switch dan gelung luar terus berjalan. Dua model mental ini mudah dicampur, jadi semak lokasi break anda dengan teliti.

Contoh praktikal: menyusun senarai

Gelung paling kerap digunakan untuk menjana paparan senarai. Contoh berikut membaca senarai produk dan menyusunnya mengikut abjad sebelum dipaparkan:

produk = ["Pensel", "Buku", "Pemadam", "Kertas"];
arraySort(produk, "textnocase");

for (p in produk) {
    writeOutput("<li>#p#</li>");
}

Apabila senarai datang daripada query, gelung for-in atas objek query memberi akses terus kepada lajur sebagai kunci baris. Gabungkan dengan cfif untuk mewarnakan baris ganjil dan genap, satu corak paparan jadual yang sangat lazim.

Contoh praktikal: menapis data

Menapis bermaksud memilih subset daripada koleksi. Gunakan gelung dengan syarat di dalamnya, atau fungsi tatasusunan seperti arrayFilter untuk pendekatan yang lebih deklaratif:

nombor = [3, 7, 10, 15, 22];

// Cara gelung eksplisit
genap = [];
for (n in nombor) {
    if (n mod 2 == 0) {
        genap.append(n);
    }
}

// Cara fungsi tatasusunan
genap2 = arrayFilter(nombor, function(n) {
    return n mod 2 == 0;
});

arrayFilter menerima closure yang mengembalikan nilai benar atau salah, sama seperti konsep closure yang dibincangkan dalam panduan fungsi dan komponen CFC. Untuk set data besar yang tinggal dalam pangkalan data, menapis dalam SQL biasanya lebih pantas daripada menarik semua baris lalu menapis dalam CFML.

Kesilapan biasa dan cara mengelaknya

Gelung tak berkesudahan ialah ralat paling lazim. Ia berlaku apabila syarat gelung while tidak pernah menjadi salah, contohnya terlupa menambah pembilang atau menukar nilai yang diuji. Pastikan setiap while dan do-while mempunyai jalan keluar yang jelas, dan gunakan break untuk syarat keluar awal apabila perlu.

Kesilapan kedua ialah mengubah suai tatasusunan semasa mengulangnya, yang boleh melangkau elemen atau mengubah panjang gelung di tengah jalan. Bina senarai baharu dan bukannya memadam dalam gelung asal. Kesilapan ketiga ialah ralat satu-lebih (off-by-one), di mana gelung indeks bermula atau berakhir pada nilai yang salah. Ingat bahawa tatasusunan CFML biasanya diindeks dari 1, bukan 0, jadi gelung dari 1 hingga arrayLen(x) meliputi semua elemen. Untuk memahami mengapa indeks dan skop berkelakuan sedemikian, rujuk panduan memahami scope CFML.

Amalan terbaik ringkas

Gunakan for-in untuk tatasusunan, struct dan query kerana ia lebih bersih daripada indeks manual. Simpan gelung bersarang minimum dan pindahkan logik berat ke dalam fungsi pembantu. Gunakan ternary untuk syarat satu baris yang mudah. Sentiasa nyatakan skop pemboleh ubah dengan jelas bagi mengelak skop cascade yang perlahan atau salah. Akhir sekali, uji gelung anda dengan set data kosong dan set data satu elemen, kerana kedua-dua kes sempadan ini paling kerap mendedahkan ralat.

Memilih Gelung yang Sesuai

CFML menawarkan beberapa jenis gelung dalam gaya skrip dan tag, dan setiap satu sesuai untuk kes yang berbeza. Jadual ini membantu anda memilih berdasarkan keperluan.

GelungBila sesuaiCatatan
for (indeks)Perlu nombor kauntercontoh: i = 1; i <= 5; i++
for-inUlang tatasusunan, struct, queryBersih tanpa indeks manual
whileSyarat disemak sebelum lelaranBoleh tidak berjalan langsung
do-whileJalankan badan sekali dahuluSesuai untuk input minimum satu pusingan
cfloop (tag)Templat paparanPadanan gelung gaya tag

Pilih gelung yang paling jelas menggambarkan niat anda, dan pastikan setiap gelung ada jalan keluar.

Soalan Lazim (FAQ)

Bagaimana cara mengulang atas query dalam CFML?

Guna gelung for-in dalam sintaks skrip, atau atribut query pada cfloop dalam gaya tag. Setiap lelaran memberi anda satu baris yang lajurnya boleh diakses sebagai kunci.

Apa beza cfloop dan gelung skrip?

Kedua-duanya mencapai perkara yang sama. cfloop ialah bentuk tag dengan atribut seperti from, to, array dan query, manakala gelung skrip menggunakan for, for-in dan while. cfloop juga sah di dalam cfscript.

Adakah switch dalam CFML memerlukan break?

Dalam gaya tag, cfcase tidak jatuh terus, jadi break tidak diperlukan. Dalam gaya skrip, case jatuh terus mengikut semantik C, jadi anda mesti menulis break untuk berhenti selepas padanan.

Bagaimana cara menghentikan gelung lebih awal?

Guna break dalam sintaks skrip atau cfbreak dalam gaya tag. Untuk melangkau satu lelaran sahaja, guna continue atau cfcontinue. Kedua-duanya menyokong label untuk menyasar gelung tertentu.

Mengapa gelung saya tidak pernah berhenti?

Kemungkinan besar syarat gelung while tidak pernah menjadi salah, contohnya pembilang tidak ditambah. Semak syarat tamat, atau tambah break untuk keluar awal apabila syarat khas dipenuhi.

Sumber

0 komen

Log masuk untuk menjawab atau memberi komen.

Log masuk