0
votes

Comprendre l'inférence de type

Je crois avoir un problème avec le type de données et la propriété de iTER code>. Il est d'abord déclaré à l'intérieur du pour code> expression de boucle. Je crois que la rouille infère que iter code> est de type u16 code> car il est utilisé à l'intérieur de mon calcul sur la ligne 4.

error[E0277]: the type `[std::option::Option<u16>]` cannot be indexed by `u16`
  --> exercises/option/option1.rs:3:9
   |
7  |         numbers[iter] = Some(number_to_add);
   |         ^^^^^^^^^^^^^ slice indices are of type `usize` or ranges of `usize`
  • J'ai essayé de casting iTer code> comme u16 code> à l'intérieur du calcul en ligne 4, mais toujours ayant des problèmes. li> ul>

    Où est ma mauvaise idée? p> p>


1 commentaires

J'ai essayé de casting iter comme u16 à l'intérieur du calcul de la ligne 4, mais recevez toujours la même erreur. Ce n'est pas la même erreur. Ajouter = [Aucun; 5] à la déclaration de numéros et il compilera.


3 Réponses :


1
votes

Votre hypothèse est correcte. Et votre correctif était OK aussi (il a conduit à une erreur différente, voir ci-dessous).

Votre premier problème était que pour l'indexation des tranches, ITER doit être de type user p> de sorte que p> soit P> xxx pré>

ou p> xxx pré>

conduira à une inférence de type correcte via Rusc. p>

Votre deuxième problème était que les chiffres étaient Non initialisé, Rustc vous avertit correctement lorsque vous essayez de modifier les numéros. Affectant une valeur, E.G., P>

let mut numbers: [Option<u16>; 5] = [None; 5];


0 commentaires

0
votes

Mis à part les réponses existantes, une approche de niveau quelque peu plus élevée pourrait également être plus propre (selon le goût) xxx pré>

une autre alternative serait une approche plus paresseuse, mais il y a (Afaik) non façon de par exemple try_collect code> dans un tableau, seul try_from code> une tranche sur un tableau, vous devez donc collecter () à une VEC, puis try_from code> à Un tableau, qui semble moins que utile. Bien que vous puissiez toujours utiliser un itérateur pour initialiser votre tableau: p> xxx pré>

aussi p>

 // `iter` moves to inner scope


0 commentaires

0
votes

Votre raisonnement est correct. Juste pour ajouter, si vous souhaitez uniquement initialiser votre tableau, vous pouvez également considérer cette façon de le faire:

let arr_elem = |i: u16| Some(((i * 5) + 2) / (4 * 16));
let numbers : [Option<u16>; 5] = [
    arr_elem(0),
    arr_elem(1),
    arr_elem(2),
    arr_elem(3),
    arr_elem(4),
];


0 commentaires