J'ai appris le zig pour mon projet de développement de jeux, lisez-en plus ici. Ce sont mes premières impressions (pour la plupart positives) du langage, issues d'une expérience récente principalement JS/TS.
Les erreurs sont des valeurs - C'est une opinion assez répandue à ce stade que les exceptions ne sont pas les meilleures. Ils créent un flux de contrôle caché et, en JavaScript, ils ne peuvent même pas être déclarés ; ce qui rend vos applications beaucoup plus instables.
Zig utilise des énumérations d'erreurs et un joli sucre syntaxique pour une gestion des erreurs facile et amusante. Par exemple :
fn failingFunction() error{MyError}!void { return error.MyError; } pub fn main() !void { try failingFunction(); }
Dans le code ci-dessus, nous déclarons une erreur MyError (Cela peut également être fait séparément) et la renvoyons.
Le try signifie "si cela renvoie une erreur, renvoyez-la ici" comme dans :
failingFunction() catch |err| return err;
Je crois que cette approche est une excellente combinaison et nous évite les si (euh ! = nul) sans fin dans Go land.
Autres points forts :
La syntaxe !void - ! est utilisé pour créer une union entre le type de retour et les types d’erreur. Zig prend en charge le fait de ne pas ajouter d'erreurs avant le !, ce qui est censé créer une union de toutes les erreurs que vous renvoyez réellement depuis la fonction.
En pratique, je trouve cette syntaxe inutile. Au moins avec mon expérience IDE, je n'obtiens aucune intellisense dans ce cas, et cela rend la fonction moins claire. Dites-moi simplement ce que vous allez rendre !
Je ne vois que cela soit utile sur la fonction main().
Vous savez comment, dans TS, vous pouvez avoir un type comme number | indéfini? Vous pouvez utiliser un if ou une logique pour affiner le type à ce dont vous avez besoin, et TS affiche automatiquement le nouveau type correctement.
Bien que ce soit facile, cette approche pose des problèmes :
Dans Zig, vous faites cela avec "Payload Capturing". Vous pouvez "capturer", c'est-à-dire créer une nouvelle variable immuable avec le type résultant. Par exemple :
const maybe_num: ?usize = 10; // `?` Means it can be `null` if (maybe_num) |num| { // Use num }
Ce qui se passe est très clair ! De plus, la variable est immuable, mais si vous vraiment avez besoin de la modifier, vous pouvez capturer un pointeur vers la valeur à la place.
Il convient également de mentionner que ce mécanisme peut être utilisé dans tout le langage, notamment : for, switch, catch, etc.
C'est vrai que je n'avais pas encore saisi toutes les possibilités du comptime. Mais en bref, vous pouvez exécuter du code normal lors de la compilation. Vous pouvez créer des fonctions entières qui ne sont utilisées que pendant cette période et renvoyer des erreurs de compilation si nécessaire.
Ça convient plutôt bien à Zig, car c'est un langage très malléable. Même les types sont des valeurs, ce qui signifie que vous pouvez créer, modifier et obtenir des informations sur les types (surtout en comptime).
Un exemple de base tiré du Guide 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
J'utilise VSCode avec le plugin officiel Zig (qui utilise zls). L'intellisense et les erreurs que je vois dans l'éditeur laissent beaucoup à désirer.
Les"comportements illégaux détectables", c'est-à-dire les éléments illégaux qui entraîneront une erreur de compilation, ne sont généralement pas affichés dans l'éditeur. Par exemple :
const nums = [3]u8{ 2, 1, 3 }; _ = nums[4]; // Index out of bounds error
Je suis sur la version 0.14 (dev) master branch, si c'est censé fonctionner faites le moi savoir dans les commentaires !
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!