Maison > interface Web > js tutoriel > Zig Premières impressions d'un développeur JS

Zig Premières impressions d'un développeur JS

PHPz
Libérer: 2024-08-24 22:31:38
original
981 Les gens l'ont consulté

Zig First Impressions from a JS Dev

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.

Gestion des erreurs

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();
}
Copier après la connexion

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;
Copier après la connexion

Je crois que cette approche est une excellente combinaison et nous évite les si (euh ! = nul) sans fin dans Go land.

Autres points forts :

  • Les erreurs sont explicites, tous les types doivent être déclarés et traités
  • La manipulation se fait sur-le-champ, pas au niveau du bloc
  • Grâce à la capture de la charge utile, les erreurs sont saisies correctement et automatiquement complétées, ce qui facilite l'utilisation de quelque chose comme une expression de commutation.

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

Capture de charge utile

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 :

  • Si les types peuvent changer tout au long d'une fonction, c'est plus difficile à suivre
  • Dans certains cas il faut quand même faire un casting

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
}
Copier après la connexion

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.

Les manigances de Comptime

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
Copier après la connexion

Expérience d'éditeur

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
Copier après la connexion

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!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal