J'ai le code suivant:
https://play.rust-lang.org/?gist=b8c78d5084a9b9ab7c53a2a9faa022af&version=stable&backtrace=0
Comme on peut le voir, le #[test] fonctionne bien, mais si j'essaie d'exécuter un test de fret dessus, j'obtiens l'erreur suivante sur le doc_test :
les échecs:
---- vec::<&'un vecteur
erreur : débordement évaluant l'exigence <&_ as std::ops::Add<_>>::Output
[E0275]#![recursion_limit="128"]
à votre caisse
erreur : abandon en raison d'une erreur précédente
Il semble que la fonction qui échouera dépend du compilateur. J'ai l'impression qu'à la maison, les deux implémentations d'Add for &Vector échoueront, mais je peux me tromper et je mettrai à jour ce problème lorsque je rentrerai chez moi.
C'est la version rouille que j'utilise ici :
rustc 1.10.0-dev (14f61c87f 2016-04-18)
binaire : rouillec
commit-hachage : 14f61c87ff02e57d565d4fab4ce790156c9a596e
date d'engagement : 2016-04-18
hôte : x86_64-unknown-linux-gnu
version : 1.10.0-dev
La discussion sur les forums de rouille peut être trouvée ici:
https://users.rust-lang.org/t/weird-problems-with-recursion-in-type-bounds-in-tests-on-libs/6101/4
mise à jour : je me suis trompé, à la maison j'obtiens le même comportement. Mais comme @mbrubeck l'a dit sur la discussion du forum, si je supprime les deux derniers Add impls, tout fonctionne.
Au cas où cela serait utile, ce programme beaucoup plus court donne un comportement similaire :
https://play.rust-lang.org/?gist=2f793999729aec2cd8274157f7012e5d&version=stable&backtrace=0
Comparez cette version, qui compile et fonctionne très bien :
https://play.rust-lang.org/?gist=6ff433c8cc94c22985180210cc3a8e7d&version=stable&backtrace=0
Voici une autre minimisation du programme de @apt1002 :
https://play.rust-lang.org/?gist=0a77e1bd0f8e539d8a85ee30ed63b1f6&version=stable&backtrace=0
Un fil conducteur sur tous ces programmes défaillants est qu'il y a 2 couches de « conteneurisation », que ce soit &
, Vector
, ou une structure wrapper.
Bonne idée pour supprimer le non-sens à vie. Beaucoup plus clair.
Je pense que nous avons tous les deux fait des erreurs ! Le mien était que "où Target: From<&'m T>" aurait dû être " where Target: for<'a> From<&'a T> ". Je viens juste d'apprendre ça. Le vôtre est que "(a.0).0" devrait être " C((a.0).0) ".
Le message d'erreur est inchangé dans les deux cas, c'est-à-dire qu'il ressemble toujours à un bogue du compilateur. Je pense que ces exemples devraient fonctionner, mais à tout le moins, le compilateur ne donne pas le bon message d'erreur.