• [^] # Re: On m'avait dit que c'était impossible alors il l'a fait

    Posté par (site web personnel) . En réponse au journal Appel à contribution pour un nouveau langage !. Évalué à 3.

    Je vais juste donner un exemple

    std::string insert_foo_at_index_and_return_previous(std::vector<std::string> &list, int index) {
     //OK, std::vector::operator[] throws if out of range
     std::string &old = list[index]; 
     list.insert(index, "foo");
     // BUG! insert modifie le vecteur et rends les références invalides: crash probable
     return old;
    }

    Rust ne permet pas de faire cette faute car il n'autoriserait pas la référente old d'être valide après un appel vers une fonction non-const du vecteur qui est "emprunté".

    Là c'est juste un exemple, mais il y a plein de cas d'erreur qui ne sont pas possible en Rust sans éviter unsafe. Et cela peut devenir assez compliqué. Un autre exemple est la variance: https://doc.rust-lang.org/nomicon/subtyping.html : Le compilateur se charge de s'assurer qu'aucune erreur n'est commise et si tu fait une erreur, le compilateur te le fait savoir. (En pratique, on n'a pas besoin de comprendre cette page sauf si on veux faire code unsafe avec une interface safe.)