Я хотел бы использовать Peekable
в качестве основы для новой cautious_take_while
операции, которая действует как take_while
от IteratorExt
, но не потребляя первую неудачную деталь. (Есть вопрос о том, является ли это хорошей идеей, и есть ли лучшие способы достижения этой цели в Rust - я был бы рад за намеки в этом направлении, но в основном я пытаюсь понять, где мой код ломки)., реализующий «осторожный» take_while использования Peekable
API-интерфейс, я пытаюсь включить в основном:
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")
Я взял трещину в creating a MCVE here, но я получаю:
:10:5: 10:19 error: cannot move out of borrowed content :10 chars.by_ref().cautious_take_while(|&x| x != '.');
Насколько я могу сказать , Я придерживаюсь той же модели, что и у Rust's TakeWhile
с точки зрения моих подписей функций, но я вижу различное поведение от заимствования. Может кто-то указать, что я делаю неправильно?
Спасибо @rodrigo! Я включил ваше первое предложение для создания рабочего примера на http://is.gd/NalTYL. Но когда я пытаюсь ввести текст в структуру, как в http://is.gd/6c64vf, я получаю 'error: черта * core :: clone :: Clone * не реализована для типа * & mut core: : iter :: Peekable * ', который я, похоже, не могу преодолеть, добавив' + Clone' к границам признаков в строке 43. –
Bosh
@Bosh. Не уверен, но я думаю, что изменяемый указатель не может быть клонирован. Ваш вариант допускает «Clone», вероятно, потому, что «Peekable» использует «Clone» явно. Возможно, вы можете сделать то же самое, но для этого кода потребуется некоторое рефакторинг ... – rodrigo
Отлично. Я остановился на «Clone» и очистил временные рамки: http://is.gd/ljjJAE. Еще раз спасибо за помощь + объяснения! – Bosh