Makro Praktikal
Kes penggunaan
Makro Praktikal ialah pelajaran Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian percuma di CoddyKit. Ini ialah pelajaran 4 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian merangkumi sejumlah 4 pelajaran.
Makro dalam Dunia Sebenar
Di luar contoh ringkas, makro menyelesaikan masalah nyata: menangkap konteks sumber, menerbitkan kelas jenis, mengesahkan literal dan menjana kod tanpa kod rangka berlebihan.
Kes Penggunaan: assert dengan Mesej
Satu makro boleh menangkap teks sumber bagi keadaan yang gagal untuk menghasilkan mesej penegasan yang membantu secara automatik.
import scala.quoted.*
inline def myAssert(inline cond: Boolean): Unit =
${ assertImpl('cond) }Menangkap Kod Sumber
Di dalam makro, cond.show (melalui API pantulan) menghasilkan sumber literal bagi ungkapan tersebut, yang kemudiannya Anda sisipkan ke dalam mesej ralat.
import scala.quoted.*
def assertImpl(cond: Expr[Boolean])(using q: Quotes): Expr[Unit] = {
import q.reflect.*
val src = Expr(cond.asTerm.show)
'{ if (!${ cond }) throw new AssertionError("failed: " + ${ src }) }
}Kes Penggunaan: Pengesahan Masa Kompilasi
Sahkan sesuatu literal (seperti ungkapan nalar atau nombor port) pada masa kompilasi supaya nilai tidak sah tidak pernah sampai ke masa jalan.
import scala.quoted.*
inline def port(inline n: Int): Int = ${ portImpl('n) }Menghentikan Pelaksanaan untuk Input Tidak Sah
Ekstrak literal, semaknya dan panggil report.errorAndAbort untuk nilai tidak sah — lalu menukar pepijat masa jalan menjadi ralat kompilasi.
import scala.quoted.*
def portImpl(n: Expr[Int])(using q: Quotes): Expr[Int] = {
import q.reflect.*
val v = n.valueOrAbort
if (v < 1 || v > 65535) report.errorAndAbort("invalid port")
n
}Kes Penggunaan: Penerbitan Kelas Jenis
Makro (selalunya melalui inline + scala.deriving.Mirror) boleh menjana tika kelas jenis seperti pengekod JSON untuk sebarang kelas kes tanpa kod rangka.
import scala.deriving.Mirror
trait Show[T] { def show(t: T): String }
inline def derived[T](using Mirror.Of[T]): Show[T] = ???Menggunakan Mirror
Mirror mendedahkan jenis dan label medan sesuatu produk pada masa kompilasi. Apabila digabungkan dengan inline, Anda boleh mengulangi medan untuk membina suatu tika.
import scala.deriving.*
import scala.compiletime.*
inline def labels[T](using m: Mirror.ProductOf[T]): List[String] =
constValueTuple[m.MirroredElemLabels].toList.map(_.toString)Kes Penggunaan: Pengelogan dengan Kedudukan
Satu makro boleh membaca Position daripada API pantulan untuk melampirkan nama fail dan nombor baris pada mesej log tanpa kos masa jalan.
import scala.quoted.*
def posImpl(using q: Quotes): Expr[String] = {
import q.reflect.*
val p = Position.ofMacroExpansion
Expr(s"${p.sourceFile.name}:${p.startLine + 1}")
}Bila Tidak Menggunakan Makro
Makro berkuasa tetapi sukar diselenggara dan dinyahpepijat. Utamakan fungsi biasa, kaedah sebaris atau penerbitan given terlebih dahulu. Gunakan makro hanya apabila semua itu tidak dapat menyatakan keperluan Anda.
Menguji Makro
Uji tingkah laku yang dijana seperti kod biasa, dan uji bahawa input tidak sah gagal dikompil dengan menggunakan alat seperti typeCheckErrors daripada utiliti ujian masa kompilasi.
Analogi Masa Jalan
Makro pengesahan masa kompilasi menghasilkan kesan yang sama seperti semakan masa jalan kendiri ini — tetapi kegagalan berlaku semasa kompilasi dan bukannya pada masa jalan.
object Main {
def port(n: Int): Int = {
require(n >= 1 && n <= 65535, "invalid port")
n
}
def main(args: Array[String]): Unit = {
println(port(8080)) // 8080
}
}Semakan Pantas
Apakah kelebihan utama mengesahkan literal dengan makro berbanding mengesahkannya pada masa jalan?
Rumusan
Anda telah meneroka kes penggunaan makro yang praktikal:
assertyang menangkap sumber- pengesahan masa kompilasi dengan
errorAndAbort - penerbitan kelas jenis melalui
Mirror - pengelogan yang mengambil kira kedudukan
- bila perlu mengelakkan makro dan cara mengujinya
Anda telah menamatkan kursus Pemprograman Meta dan Makro.
Pelajari Scala dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 39
- Pelajaran
- 143
Soalan Lazim
Adakah pelajaran “Makro Praktikal” percuma?
Ya — teks penuh “Makro Praktikal” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian, tingkat taraf kepada CoddyKit PRO. Kursus Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Makro Praktikal”?
Kes penggunaan Anda berlatih Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 4 daripada 4.
Berapa lamakah pelajaran “Makro Praktikal” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian ini?
Ya. Setiap pelajaran Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Kaedah Inline
- Asas Makro
- Petikan dan Splice
- Makro Praktikal