Je voudrais utiliser Peekable
comme base pour une nouvelle opération cautious_take_while
qui agit comme take_while
de IteratorExt
mais sans consommer le premier élément défaillant. (Il y a une question secondaire à savoir si c'est une bonne idée, et s'il y a de meilleures façons d'atteindre cet objectif dans Rust - je serais heureux pour des conseils dans ce sens, mais surtout j'essaie de comprendre où mon code est rupture).La mise en œuvre d'un « prudent » take_while utilisant Peekable
L'API que je suis en train de permettre est essentiellement:
let mut chars = "abcdefg.".chars().peekable();
let abc : String = chars.by_ref().cautious_take_while(|&x| x != 'd');
let defg : String = chars.by_ref().cautious_take_while(|&x| x != '.');
// yielding (abc = "abc", defg = "defg")
J'ai pris une fissure à creating a MCVE here, mais je me fais:
:10:5: 10:19 error: cannot move out of borrowed content :10 chars.by_ref().cautious_take_while(|&x| x != '.');
Pour autant que je peux dire , Je suis le même modèle que TakeWhile
de Rust en termes de mes signatures de fonction, mais je vois un comportement différent du vérificateur d'emprunt. Quelqu'un peut-il signaler ce que je fais mal?
Merci @rodrigo! J'ai incorporé votre première suggestion pour produire un exemple de travail à http://is.gd/NalTYL. Mais quand j'essaie d'introduire le typage dans la structure, comme dans http://is.gd/6c64vf, j'obtiens 'error: le trait * core :: clone :: Clone * n'est pas implémenté pour le type * & mut core: : iter :: Peekable * ', que je n'arrive pas à surmonter en ajoutant' + Clone' aux limites des traits à la ligne 43. –
Bosh
@Bosh. Pas sûr, mais je pense qu'un pointeur mutable ne peut pas être cloné. Votre variante accepte le 'Clone' probablement parce que' Peekable' implémente 'Clone' explicitement. Peut-être que vous pouvez faire la même chose, mais le code aurait besoin d'un refactoring ... – rodrigo
Great. J'ai arrêté de dériver de Clone et de nettoyer les timelines: http://is.gd/ljjJAE. Merci encore pour votre aide + explications! – Bosh