{"id":443544,"date":"2024-02-13T09:40:51","date_gmt":"2024-02-13T08:40:51","guid":{"rendered":"https:\/\/blog.jetbrains.com\/?post_type=rust&#038;p=443544"},"modified":"2024-02-13T09:46:16","modified_gmt":"2024-02-13T08:46:16","slug":"les-erreurs-du-compilateur-rust-les-plus-couramment-rencontrees-dans-rustrover-2eme-partie","status":"publish","type":"rust","link":"https:\/\/blog.jetbrains.com\/fr\/rust\/2024\/02\/13\/les-erreurs-du-compilateur-rust-les-plus-couramment-rencontrees-dans-rustrover-2eme-partie\/","title":{"rendered":"Les erreurs du compilateur Rust les plus couramment rencontr\u00e9es dans RustRover\u00a0&#8211; 2\u00e8me Partie"},"content":{"rendered":"<p>Les donn\u00e9es d&#8217;utilisation de RustRover nous ont permis d&#8217;identifier les 10 erreurs du compilateur Rust les plus fr\u00e9quentes, que nous avons commenc\u00e9 \u00e0 examiner dans un <a href=\"https:\/\/blog.jetbrains.com\/fr\/rust\/2024\/02\/02\/les-erreurs-du-compilateur-rust-les-plus-couramment-rencontrees-dans-rustrover-1ere-partie\/\">premier article<\/a>. Dans ce second article, nous poursuivons avec l&#8217;examen du top 5 de ces erreurs et abordons les aspects du langage Rust qui posent le plus de probl\u00e8mes aux d\u00e9veloppeurs avec le compilateur.<\/p>\n<h2 class=\"wp-block-heading\">Erreur fr\u00e9quente n\u00b0\u00a05\u00a0: E0433 (<em>Utilisation d&#8217;une crate, d&#8217;un module ou d&#8217;un type non d\u00e9clar\u00e9<\/em>)<\/h2>\n<p>Cette erreur est similaire \u00e0 l&#8217;erreur E0432 (Une importation n&#8217;a pas \u00e9t\u00e9 r\u00e9solue), que nous avons vue dans l&#8217;article pr\u00e9c\u00e9dent. La seule diff\u00e9rence ici est qu&#8217;un chemin avec un composant probl\u00e9matique est utilis\u00e9 directement dans un nom, sans la clause <code>use<\/code>. 17,5\u00a0% des utilisateurs de RustRover ont rencontr\u00e9 cette erreur. Dans l&#8217;exemple de code ci-dessous, le compilateur ne comprend pas s&#8217;il s&#8217;agit d&#8217;une crate ou d&#8217;un module et nous le fait savoir\u00a0:<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-421519\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/12\/image-25.png\" alt=\"\" width=\"1600\" height=\"900\" \/><\/figure>\n<p>Cet exemple montre pourquoi les messages d&#8217;erreur de Rust sont autant appr\u00e9ci\u00e9s. M\u00eame sans lire le message, le correctif \u00e0 apporter est \u00e9vident\u00a0: v\u00e9rifier les noms, ajouter les d\u00e9pendances requises \u00e0 <kbd>Cargo.toml<\/kbd> si n\u00e9cessaire ou introduire les importations appropri\u00e9es.<\/p>\n<p>De son c\u00f4t\u00e9, RustRover permet de choisir les noms import\u00e9s.\u00a0<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-421530\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/12\/image-26.png\" alt=\"\" width=\"1465\" height=\"411\" \/><\/figure>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-421541\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/12\/image-27.png\" alt=\"\" width=\"1477\" height=\"474\" \/><\/figure>\n<p>L&#8217;utilisation de la saisie semi-automatique de code durant la saisie permet d&#8217;\u00e9viter cette erreur.\u00a0<\/p>\n<h2 class=\"wp-block-heading\">Erreur fr\u00e9quente n\u00b0\u00a04\u00a0: E0425 (<em>Un nom non r\u00e9solu a \u00e9t\u00e9 utilis\u00e9<\/em>)<\/h2>\n<p>Poursuivons avec une autre erreur de la cat\u00e9gorie \u00ab\u00a0non r\u00e9solu\u00a0\u00bb. 20,5\u00a0% des utilisateurs de RustRover ont d\u00e9j\u00e0 \u00e9t\u00e9 dans une situation dans laquelle ils ont utilis\u00e9 un nom non r\u00e9solu, qui n&#8217;\u00e9tait syntaxiquement ni une crate ni un module. Voici ce que l&#8217;ont peut voir lorsque cette erreur survient\u00a0:<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-421552\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/12\/image-28.png\" alt=\"\" width=\"1600\" height=\"237\" \/><\/figure>\n<p>\u00c9videmment, lorsque cela arrive, le contexte n&#8217;est pas toujours aussi simple que dans cet exemple.<\/p>\n<p>H\u00e9las, m\u00eame l&#8217;excellent compilateur de Rust n&#8217;est pas d&#8217;une grande aide face \u00e0 cette erreur. Plusieurs approches\u00a0sont possibles ici : r\u00e9viser le nom, fournir une d\u00e9finition ou introduire des importations correctes.<\/p>\n<h2 class=\"wp-block-heading\">Erreur fr\u00e9quente n\u00b0\u00a03\u00a0: E0599 (<em>Une m\u00e9thode est utilis\u00e9e sur un type qui ne l&#8217;impl\u00e9mente pas<\/em>)<\/h2>\n<p>Au risque de g\u00e2cher la surprise, \u00e0 partir de maintenant, toutes les erreurs porteront sur la v\u00e9rification de type\u00a0! En effet, les trois erreurs les plus fr\u00e9quentes sont toutes li\u00e9es \u00e0 une utilisation de type incorrecte. Concernant l&#8217;erreur #3, 27,5\u00a0% des utilisateurs de RustRover ont tent\u00e9 d&#8217;appeler une m\u00e9thode sur une valeur de type qui n&#8217;impl\u00e9mente pas cette m\u00e9thode. Examinons l&#8217;exemple suivant\u00a0:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"rust\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">fn main() {\n\u00a0\u00a0\u00a0let numbers: Vec = vec![4, 11, 15, 12];\n\u00a0\u00a0\u00a0let sum: usize = numbers.sum();\n\u00a0\u00a0\u00a0println!(\"Answer = {sum}\");\n}<\/pre>\n<p>Tout semble correct, sauf qu&#8217;il n&#8217;y a pas de m\u00e9thode <code>sum<\/code> pour <code>Vec<\/code>. Voici le contenu exact du message d&#8217;erreur\u00a0:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">error[E0599]: `Vec` is not an iterator<\/pre>\n<p>Dans ce cas, il faut appeler une m\u00e9thode <code>iter<\/code> en premier, puis utiliser <code>sum<\/code> sur l&#8217;it\u00e9rateur r\u00e9sultant.\u00a0<\/p>\n<p>RustRover dispose d&#8217;une fonctionnalit\u00e9 qui permet d&#8217;\u00e9viter ce genre d&#8217;erreur : la <em>saisie semi-automatique cha\u00een\u00e9e<\/em>. Voici un exemple de ce que cela donne\u00a0:<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-421563\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/12\/image-29.png\" alt=\"\" width=\"1600\" height=\"422\" \/><\/figure>\n<p>Lorsque la suggestion de saisie semi-automatique est accept\u00e9e, les m\u00e9thodes <code>iter<\/code> et <code>sum<\/code> sont ajout\u00e9es \u00e0 la cha\u00eene d&#8217;appels, ce qui corrige imm\u00e9diatement le code.<\/p>\n<p>En g\u00e9n\u00e9ral, la saisie semi-automatique \u00e9vite de recevoir un message d&#8217;erreur E0599. Si vous ne voyez pas de suggestion pour appeler la m\u00e9thode dont vous avez besoin, il est possible que le probl\u00e8me r\u00e9el provienne en r\u00e9alit\u00e9 du fait que le type de l&#8217;appel\u00e9 est incorrect.<\/p>\n<p>Un autre aspect de cette m\u00e9thode vaut la peine d&#8217;\u00eatre mentionn\u00e9\u00a0: dans de nombreux contextes, vous avez le contr\u00f4le sur vos propres d\u00e9clarations de type. Vous pouvez notamment appeler une m\u00e9thode en premier et demander ensuite \u00e0 RustRover de proc\u00e9der au scaffolding de son impl\u00e9mentation en appuyant sur <strong>Alt-Entr\u00e9e<\/strong> (<strong>\u2325Option<\/strong>\u2013<strong>Retour<\/strong>) et en ex\u00e9cutant l&#8217;action sugg\u00e9r\u00e9e\u00a0:<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-421574\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/12\/image-30.png\" alt=\"\" width=\"1600\" height=\"574\" \/><\/figure>\n<p>Suite \u00e0 cette action, RustRover g\u00e9n\u00e8re le mod\u00e8le d&#8217;impl\u00e9mentation de la m\u00e9thode en prenant en compte les informations contextuelles concernant les types\u00a0:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"rust\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">impl Info {\n\u00a0\u00a0\u00a0pub(crate) fn summary(&amp;self) -&gt; String {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0todo!()\n\u00a0\u00a0\u00a0}\n}<\/pre>\n<p>L&#8217;ex\u00e9cution de ce code r\u00e9sulte en une erreur d&#8217;ex\u00e9cution, mais au moins le compilateur n&#8217;y trouve rien \u00e0 redire.<\/p>\n<h2 class=\"wp-block-heading\">Erreur fr\u00e9quente n\u00b0\u00a02\u00a0: E0308 (<em>Le type attendu ne correspondait pas au type re\u00e7u<\/em>)<\/h2>\n<p>Imaginez que vous utilisiez une expression de type <code>A<\/code> dans un contexte o\u00f9 une valeur de type <code>B<\/code> est attendue. Ici, la notion de \u00ab\u00a0contexte\u00a0\u00bb peut d\u00e9signer plusieurs choses, comme un param\u00e8tre de fonction sur un site d&#8217;appel, une d\u00e9claration de variable ou une instruction\/expression de contr\u00f4le du flux. 30\u00a0% des utilisateurs de RustRover ont d\u00e9j\u00e0 \u00e9t\u00e9 dans cette situation.<\/p>\n<p>D&#8217;un point de vue conceptuel, deux choix s&#8217;offrent \u00e0 nous dans ce cas : modifier une valeur ou modifier le contexte. La modification d&#8217;une valeur peut impliquer le typage, le r\u00e9f\u00e9rencement\/d\u00e9r\u00e9f\u00e9rencement, l&#8217;appel d&#8217;une m\u00e9thode de transformation ou son remplacement par quelque chose d&#8217;autre. On ne peut pas toujours agir sur le contexte, mais il est parfois possible de modifier le type attendu pour qu&#8217;il corresponde au type re\u00e7u.<\/p>\n<p>RustRover prend en charge les deux modes op\u00e9ratoires en fournissant plusieurs correctifs rapides, par exemple\u00a0:<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-421585\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/12\/image-31.png\" alt=\"\" width=\"1600\" height=\"434\" \/><\/figure>\n<p>Notez la deuxi\u00e8me suggestion dans la liste\u00a0: dans ce cas, RustRover a sugg\u00e9r\u00e9 une transformation assez sophistiqu\u00e9e d&#8217;une valeur qui convient au compilateur. Suivre la premi\u00e8re suggestion corrigerait le contexte, \u00e0 savoir la d\u00e9finition de la fonction.\u00a0<\/p>\n<h2 class=\"wp-block-heading\">Erreur fr\u00e9quente n\u00b0\u00a01\u00a0: E0277 (<em>Vous avez essay\u00e9 d&#8217;utiliser un type qui n&#8217;impl\u00e9mente pas de trait \u00e0 un endroit o\u00f9 un trait est attendu<\/em>)<\/h2>\n<p>Enfin, nous arrivons \u00e0 la 1\u00e8re place du classement\u00a0! L&#8217;erreur du compilateur Rust la plus fr\u00e9quemment rencontr\u00e9e dans RustRover est E0277. 32\u00a0% des utilisateurs de RustRover ont fait l&#8217;exp\u00e9rience de cette situation cauchemardesque m\u00ealant types et traits. L&#8217;<a href=\"https:\/\/doc.rust-lang.org\/error_codes\/E0277.html\" target=\"_blank\" rel=\"noopener\">explication officielle<\/a> fait un bon travail en fournissant des exemples et des explications des correctifs possibles. Ici, nous allons observer le comportement de RustRover.<\/p>\n<p>Voici ma fonctionnalit\u00e9 de RustRover pr\u00e9f\u00e9r\u00e9e lorsqu&#8217;il s&#8217;agit de ce genre d&#8217;erreur\u00a0:\u00a0<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-421596\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/12\/image-32.png\" alt=\"\" width=\"1600\" height=\"548\" \/><\/figure>\n<p>Le compilateur renvoie le message d&#8217;erreur suivant\u00a0:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">error[E0277]: `Info` doesn't implement `std::fmt::Display`<\/pre>\n<p>Bien s\u00fbr, l&#8217;impl\u00e9mentation du trait<code>Display<\/code> est un choix possible, et RustRover peut aider pour le scaffolding d&#8217;une impl\u00e9mentation. Mais dans ce cas, je pr\u00e9f\u00e8re appliquer la premi\u00e8re suggestion, qui comprend deux \u00e9tapes simultan\u00e9es\u00a0:<\/p>\n<ul>\n<li>D\u00e9rivation d&#8217;une impl\u00e9mentation pour le trait <code>Debug<\/code>.<\/li>\n<li>Modifier la cha\u00eene de format pour appeler le formatage du trait <code>Debug<\/code>.<\/li>\n<\/ul>\n<p>Malheureusement, dans de nombreux autres cas, RustRover ne parvient pas \u00e0 d\u00e9couvrir et \u00e0 mettre en \u00e9vidence cette erreur par lui-m\u00eame. Comme mentionn\u00e9 dans l&#8217;article pr\u00e9c\u00e9dent, sa fonctionnalit\u00e9 de v\u00e9rification de type n&#8217;est pas encore assez puissante, mais nous travaillons activement \u00e0 son am\u00e9lioration.<\/p>\n<h2 class=\"wp-block-heading\">Observation des erreurs Rust en g\u00e9n\u00e9ral<\/h2>\n<p>R\u00e9cemment, nous avons <a href=\"https:\/\/x.com\/rustrover\/status\/1735315851841040657\" target=\"_blank\" rel=\"noopener\">fait un sondage<\/a> aupr\u00e8s des membres de la communaut\u00e9 afin de savoir quelle est l&#8217;aspect du langage causant le plus d&#8217;erreurs dans leur code, et voici les r\u00e9ponses que nous avons obtenues :<\/p>\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-421890\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2023\/12\/Screenshot-2023-12-20-at-17.09.02.png\" alt=\"\" width=\"1168\" height=\"381\" \/><\/figure>\n<p>Afin de comparer les r\u00e9ponses de la communaut\u00e9 \u00e0 nos donn\u00e9es, nous avons examin\u00e9 les 25 erreurs de compilateur Rust les plus fr\u00e9quentes et les avons class\u00e9es en cinq grandes cat\u00e9gories\u00a0:<\/p>\n<ul>\n<li>Types et traits<\/li>\n<li>Propri\u00e9t\u00e9 et dur\u00e9es de vie<\/li>\n<li>Macros<\/li>\n<li>Noms non r\u00e9solus ou \u00e9l\u00e9ments inexistants<\/li>\n<li>Autre<\/li>\n<\/ul>\n<p>Voici les r\u00e9sultats (num\u00e9ros de code d&#8217;erreur class\u00e9s par ordre croissant) :<\/p>\n<figure class=\"wp-block-table\">\n<table>\n<tbody>\n<tr>\n<td><strong>Code de l&#8217;erreur<\/strong><\/td>\n<td><strong>Description<\/strong><\/td>\n<td><strong>Cat\u00e9gorie\u00a0<\/strong><\/td>\n<\/tr>\n<tr>\n<td>E0061<\/td>\n<td>Un nombre non valide d&#8217;arguments a \u00e9t\u00e9 pass\u00e9 lors de l&#8217;appel d&#8217;une fonction.<\/td>\n<td>Autre<\/td>\n<\/tr>\n<tr>\n<td>E0063<\/td>\n<td>Aucun champ de structure ou de variante d&#8217;\u00e9num\u00e9ration de type structure n&#8217;a \u00e9t\u00e9 fourni.<\/td>\n<td>non r\u00e9solu\/non existant<\/td>\n<\/tr>\n<tr>\n<td>E0106<\/td>\n<td>Cette erreur indique que l&#8217;un des types ne comporte pas de dur\u00e9e de vie.<\/td>\n<td>propri\u00e9t\u00e9 et dur\u00e9es de vie<\/td>\n<\/tr>\n<tr>\n<td>E0107<\/td>\n<td>Un nombre incorrect d&#8217;arguments g\u00e9n\u00e9riques a \u00e9t\u00e9 fourni.<\/td>\n<td>types et traits<\/td>\n<\/tr>\n<tr>\n<td>E0277<\/td>\n<td>Vous avez essay\u00e9 d&#8217;utiliser un type qui n&#8217;impl\u00e9mente pas un trait \u00e0 un endroit o\u00f9 un trait est attendu<\/td>\n<td>types et traits<\/td>\n<\/tr>\n<tr>\n<td>E0282<\/td>\n<td>Le compilateur n&#8217;a pas pu d\u00e9duire un type et a demand\u00e9 une annotation de type.<\/td>\n<td>types et traits<\/td>\n<\/tr>\n<tr>\n<td>E0283<\/td>\n<td>Une impl\u00e9mentation ne peut pas \u00eatre choisie de fa\u00e7on claire en raison du manque d&#8217;informations.<\/td>\n<td>types et traits<\/td>\n<\/tr>\n<tr>\n<td>E0308<\/td>\n<td>Le type attendu ne correspond pas au type re\u00e7u.<\/td>\n<td>types et traits<\/td>\n<\/tr>\n<tr>\n<td>E0369<\/td>\n<td>Une op\u00e9ration binaire a \u00e9t\u00e9 tent\u00e9e sur un type qui ne la prend pas en charge.<\/td>\n<td>types et traits<\/td>\n<\/tr>\n<tr>\n<td>E0382<\/td>\n<td>Une variable a \u00e9t\u00e9 utilis\u00e9e apr\u00e8s que son contenu ait \u00e9t\u00e9 d\u00e9plac\u00e9.<\/td>\n<td>propri\u00e9t\u00e9 et dur\u00e9es de vie<\/td>\n<\/tr>\n<tr>\n<td>E0412<\/td>\n<td>Un nom de type utilis\u00e9 n&#8217;est pas dans la port\u00e9e.<\/td>\n<td>non r\u00e9solu\/non existant<\/td>\n<\/tr>\n<tr>\n<td>E0423<\/td>\n<td>Un identifiant a \u00e9t\u00e9 utilis\u00e9 comme un nom de fonction ou une valeur \u00e9tait attendue et l&#8217;identifiant existe mais appartient \u00e0 un espace de nom diff\u00e9rent.<\/td>\n<td>non r\u00e9solu\/non existant<\/td>\n<\/tr>\n<tr>\n<td>E0425<\/td>\n<td>Un nom non r\u00e9solu a \u00e9t\u00e9 utilis\u00e9.<\/td>\n<td>non r\u00e9solu\/non existant<\/td>\n<\/tr>\n<tr>\n<td>E0432<\/td>\n<td>Une importation n&#8217;a pas \u00e9t\u00e9 r\u00e9solue.<\/td>\n<td>non r\u00e9solu\/non existant<\/td>\n<\/tr>\n<tr>\n<td>E0433<\/td>\n<td>Une crate, un module ou un type non d\u00e9clar\u00e9 a \u00e9t\u00e9 utilis\u00e9.<\/td>\n<td>non r\u00e9solu\/non existant<\/td>\n<\/tr>\n<tr>\n<td>E0502<\/td>\n<td>Une variable d\u00e9j\u00e0 emprunt\u00e9e comme immuable a \u00e9t\u00e9 emprunt\u00e9e comme mutable.<\/td>\n<td>propri\u00e9t\u00e9 et dur\u00e9es de vie<\/td>\n<\/tr>\n<tr>\n<td>E0507<\/td>\n<td>Une valeur emprunt\u00e9e a \u00e9t\u00e9 d\u00e9plac\u00e9e.<\/td>\n<td>propri\u00e9t\u00e9 et dur\u00e9es de vie<\/td>\n<\/tr>\n<tr>\n<td>E0515<\/td>\n<td>Une r\u00e9f\u00e9rence \u00e0 une variable locale a \u00e9t\u00e9 renvoy\u00e9e.<\/td>\n<td>propri\u00e9t\u00e9 et dur\u00e9es de vie<\/td>\n<\/tr>\n<tr>\n<td>E0596<\/td>\n<td>Cette erreur se produit parce que vous avez tent\u00e9 d&#8217;emprunter de fa\u00e7on mutable une variable non mutable.<\/td>\n<td>propri\u00e9t\u00e9 et dur\u00e9es de vie<\/td>\n<\/tr>\n<tr>\n<td>E0597<\/td>\n<td>Cette erreur se produit car une valeur a \u00e9t\u00e9 supprim\u00e9e alors qu&#8217;elle \u00e9tait encore emprunt\u00e9e.<\/td>\n<td>propri\u00e9t\u00e9 et dur\u00e9es de vie<\/td>\n<\/tr>\n<tr>\n<td>E0599<\/td>\n<td>Cette erreur se produit lorsqu&#8217;une m\u00e9thode est utilis\u00e9e pour un type qui ne l&#8217;impl\u00e9mente pas.<\/td>\n<td>types et traits<\/td>\n<\/tr>\n<tr>\n<td>E0609<\/td>\n<td>Tentative d&#8217;acc\u00e8s \u00e0 un champ non existant dans une structure.<\/td>\n<td>non r\u00e9solu\/non existant<\/td>\n<\/tr>\n<tr>\n<td>E0614<\/td>\n<td>Tentative de d\u00e9f\u00e9rencement d&#8217;une variable qui ne peut pas \u00eatre d\u00e9f\u00e9renc\u00e9e.<\/td>\n<td>Autre<\/td>\n<\/tr>\n<tr>\n<td>E0658<\/td>\n<td>Une fonctionnalit\u00e9 instable a \u00e9t\u00e9 utilis\u00e9e.<\/td>\n<td>Autre<\/td>\n<\/tr>\n<tr>\n<td>E0716<\/td>\n<td>Une valeur temporaire est supprim\u00e9e alors qu&#8217;un emprunt est toujours actif.<\/td>\n<td>propri\u00e9t\u00e9 et dur\u00e9es de vie<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p>Malheureusement, les donn\u00e9es dont nous disposons ne donnent pas beaucoup d&#8217;informations sur les macros. Nous ne pouvons ni d\u00e9tecter de fa\u00e7on fiable les probl\u00e8mes d&#8217;expansion de macros, ni identifier d&#8217;autres erreurs r\u00e9sultant d&#8217;expansions de macros r\u00e9ussies. Cela montre que nous pourrions appliquer une cat\u00e9gorisation plus fine aux donn\u00e9es que nous collectons.\u00a0<\/p>\n<p>En faisant abstraction des macros, aucune des 25 erreurs les plus fr\u00e9quentes ne se d\u00e9tache v\u00e9ritablement, il ne semble donc pas qu&#8217;il y ait un aspect de Rust en particulier qui pose davantage probl\u00e8me aux d\u00e9veloppeurs :<\/p>\n<ul>\n<li>Types et traits &#8211; 7 erreurs<\/li>\n<li>Propri\u00e9t\u00e9 et dur\u00e9es de vie &#8211; 8 erreurs<\/li>\n<li>Noms non r\u00e9solus ou \u00e9l\u00e9ments inexistants &#8211; 7 erreurs<\/li>\n<li>Autres &#8211; 3 erreurs<\/li>\n<\/ul>\n<h2 class=\"wp-block-heading\">R\u00e9sum\u00e9<\/h2>\n<p>Dans ce second article, nous avons pass\u00e9 en revue les cinq erreurs du compilateur Rust les plus fr\u00e9quemment rencontr\u00e9es dans RustRover et les correctifs possibles. Trois d&#8217;entre elles se rapportent aux types et traits, ce dont on peut d\u00e9duire que ces \u00e9l\u00e9ment ont un r\u00f4le significatif dans l&#8217;obtention d&#8217;un meilleur code Rust de meilleure qualit\u00e9. En examinant des donn\u00e9es plus g\u00e9n\u00e9rales relatives aux 25 erreurs les plus fr\u00e9quentes, on voit aussi que bien d&#8217;autres aspects de Rust peuvent contribuer aux erreurs que nous rencontrons souvent.<\/p>\n<p><em>Auteur de l&#8217;article original en anglais<\/em> :<\/p>\n\n    <div class=\"about-author \">\n        <div class=\"about-author__box\">\n            <div class=\"row\">\n                <div class=\"about-author__box-img\">\n                    <img decoding=\"async\" src=\"https:\/\/secure.gravatar.com\/avatar\/?s=200&#038;r=g\" width=\"200\" height=\"200\" alt=\"\" loading=\"lazy\"  class=\"avatar avatar-200 wp-user-avatar wp-user-avatar-200 photo avatar-default\">\n                <\/div>\n                <div class=\"about-author__box-text\">\n                                                        <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n","protected":false},"author":813,"featured_media":421609,"comment_status":"closed","ping_status":"closed","template":"","categories":[],"tags":[],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/rust\/443544"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/rust"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/types\/rust"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/users\/813"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/comments?post=443544"}],"version-history":[{"count":10,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/rust\/443544\/revisions"}],"predecessor-version":[{"id":443672,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/rust\/443544\/revisions\/443672"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/media\/421609"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/media?parent=443544"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/categories?post=443544"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/tags?post=443544"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/cross-post-tag?post=443544"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}