Saya telah belajar zig untuk projek pembangunan permainan saya, baca lebih lanjut mengenainya di sini. Itu adalah tanggapan awal saya (kebanyakannya positif) tentang bahasa itu, datang daripada pengalaman JS/TS baru-baru ini.
Ralat adalah nilai- Pada ketika ini pendapat yang agak popular bahawa pengecualian bukanlah yang terbaik. Mereka mencipta aliran kawalan tersembunyi, dan dalam JavaScript mereka tidak boleh diisytiharkan pun; yang menjadikan aplikasi anda lebih tidak stabil.
Zig menggunakan enum ralat dan gula sintaksis yang bagus untuk pengendalian ralat yang mudah dan menyeronokkan. Contohnya:
fn failingFunction() error{MyError}!void { return error.MyError; } pub fn main() !void { try failingFunction(); }
Dalam kod di atas kami mengisytiharkan ralat MyError (Ini juga boleh dilakukan secara berasingan) dan mengembalikannya.
Percubaan bermaksud "jika ini mengembalikan ralat, kembalikan ke sini" seperti dalam:
failingFunction() catch |err| return err;
Saya percaya pendekatan ini merupakan gabungan yang hebat dan menyelamatkan kita daripada perkara yang tidak berkesudahan jika (err != nil) di Go land.
Sorotan lain:
Sintaks !void- ! digunakan untuk mencipta kesatuan antara jenis pulangan dan jenis ralat. Zig menyokong tidak menambah sebarang ralat sebelum !, yang sepatutnya mewujudkan gabungan semua ralat yang sebenarnya anda kembalikan daripada fungsi tersebut.
Dalam amalan, saya mendapati sintaks ini tidak membantu. Sekurang-kurangnya dengan pengalaman IDE saya, saya tidak mendapat sebarang intellisense dalam kes ini, dan ia menjadikan fungsi kurang jelas.Cukup beritahu saya apa yang anda akan pulangkan!
Saya hanya nampak ia berguna pada fungsi main().
Anda tahu bagaimana dalam TS anda mungkin mempunyai jenis seperti nombor | tidak ditentukan? Anda mungkin menggunakan if atau beberapa logik untuk mengecilkan jenis kepada perkara yang anda perlukan dan TS secara automatik memaparkan jenis baharu dengan betul.
Walaupun ia mudah, terdapat masalah dengan pendekatan ini:
Di Zig, anda melakukan ini dengan "Tangkapan Muatan". Anda boleh "menangkap" aka mencipta pembolehubah tidak berubah baharu dengan jenis yang terhasil. Contohnya:
const maybe_num: ?usize = 10; // `?` Means it can be `null` if (maybe_num) |num| { // Use num }
Sangat jelas apa yang berlaku! Lebih-lebih lagi, pembolehubah itu tidak boleh diubah, tetapi jika andabenar-benarperlu mengubahnya, anda boleh menangkap penunjuk kepada nilai sebaliknya.
Perlu juga dinyatakan bahawa mekanisme ini boleh digunakan di seluruh bahasa, termasuk: untuk, suis, tangkap, dll.
Diakui saya masih belum memahami sepenuhnya kemungkinan comptime. Tetapi secara ringkasnya, anda boleh menjalankan kod biasa semasa penyusunan. Anda boleh mencipta keseluruhan fungsi yang hanya digunakan pada masa ini dan boleh mengembalikan ralat kompilasi jika perlu.
Ia sangat sesuai dengan Zig, kerana ia adalah bahasa yang sangat mudah dibentuk. Malah jenis adalah nilai, bermakna anda boleh membuat, menukar dan mendapatkan maklumat tentang jenis (Terutama dalam masa kompaun).
Contoh asas ini daripada Panduan Zig:
const a = 5; // When a number type isn't specified, it defaults to comptime_int const b: if (a < 10) f32 else i32 = 5; // b: f32 after compilation
Saya menggunakan VSCode dengan pemalam Zig rasmi (yang menggunakan zls). Kecerdasan dan kesilapan yang saya lihat dalam editor meninggalkan banyak yang diingini.
"kelakuan haram yang boleh dikesan"aka perkara yang menyalahi undang-undang yang akan mengakibatkan ralat kompilasi biasanya tidak dipaparkan dalam editor. Contohnya:
const nums = [3]u8{ 2, 1, 3 }; _ = nums[4]; // Index out of bounds error
Saya menggunakan versi cawangan induk 0.14 (dev), jika ia sepatutnya berfungsi, beritahu saya dalam ulasan!
Atas ialah kandungan terperinci Zig Tanggapan Pertama daripada JS Dev. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!