Rumah >hujung hadapan web >tutorial js >Zig Tanggapan Pertama daripada JS Dev

Zig Tanggapan Pertama daripada JS Dev

PHPz
PHPzasal
2024-08-24 22:31:38978semak imbas

Zig First Impressions from a JS Dev

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 pengendalian

Ralat adalah nilai - Pada ketika ini, adalah 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:

  • Ralat adalah jelas, semua jenis perlu diisytiharkan dan dikendalikan
  • Pengendalian dilakukan segera dan di sana, bukan pada tahap blok
  • Terima kasih kepada penangkapan muatan, ralat ditaip dengan betul dan dilengkapkan secara automatik, menjadikannya mudah untuk menggunakan sesuatu seperti ungkapan suis.

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 dapati 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().

Tangkapan muatan

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:

  • Jika jenis boleh berubah sepanjang fungsi, ia lebih sukar untuk diikuti
  • Dalam sesetengah kes anda masih perlu melakukan pelakon

Dalam 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! Selain itu, pembolehubah itu tidak boleh diubah, tetapi jika anda benar-benar perlu menukarnya, anda boleh menangkap penunjuk kepada nilai sebaliknya.

Perlu juga dinyatakan bahawa mekanisme ini boleh digunakan di seluruh bahasa, termasuk: untuk, suis, tangkap, dll.

Kejahilan kompem

Memang 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 ialah nilai, bermakna anda boleh membuat, menukar dan mendapatkan maklumat tentang jenis (Terutama dalam masa comptime).

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

Pengalaman editor

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" alias 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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn