У меня возникла проблема с написанием Lexical Analyzer в Rust, где некоторые функции начинают жаловаться на простые фрагменты, которые иначе выглядели бы безобидными. Это начинает раздражать, поскольку сообщения об ошибках не помогают мне определить причину моих проблем, и поэтому это второй раз, когда я обращаюсь к одной и той же программе на той же неделе (предыдущий вопрос here).Путаница с недолговечными жизненными значениями, которые (на поверхности) кажутся совершенно безопасными
Я прочитал книгу, я понял все, что мог. Я также смотрел/читал многочисленные другие статьи и видеоролики, в которых обсуждалось время жизни (как явное, так и неявное), и по большей части концепция заимствований и перемещений имеет смысл, за исключением случаев, подобных следующим:
У моего лексера есть next
Функция, цель которой - заглянуть вперед в следующий символ и вернуть его.
struct Lexer<'a> {
src: str::Chars<'a>,
buf: String,
// ... not important
}
impl<'a> Lexer<'a> {
// ... not relevant
// originally this -> Option<&char> which caused it's own slew of problems
// that I thought dereferencing the character would solve.
fn next(&self) -> Option<char> {
let res = self.src.peekable().peek();
// convert Option<&char> to Option<char>
match res {
Some(ref c) => Some(*c.clone()),
None => None
}
}
// ... not relevant
}
ошибка, что я получаю, делая это:
error: borrowed value does not live long enough
let res = self.src.peekable().peek();
^~~~~~~~~~~~~~~~~~~
То, что я понял из этой ошибки в том, что значение из peekable()
не живут достаточно долго, какой вид имеет смысл меня. Я ссылаюсь только на возврат в этой строке и вызывая другую функцию, которая, как мне кажется, возвращает указатель на символ в следующем месте с итератором. Мой наивный решение это было:
let mut peeker = self.src.peekable();
let res = peeker.peek();
Если я реализую это решение, я вижу другую ошибку, которая также не имеет смысла для меня:
error: cannot move out of borrowed content
let mut peeker = self.src.peekable();
^~~~
Я не совсем уверен, что движется self
из заимствованного контекста здесь (я знаю, что это заимствовано из &self
, но не уверен, что перемещение его из заимствованного контекста.
EDIT
Я предложил вопрос с деталями, которые были дико неточными. Часть сообщения, содержащая эти детали, была обновлена с фактическими фактами - я перепутал две разные ситуации, в которых я столкнулся с подобной ошибкой (по крайней мере, по мне).
Вы уверены, что ошибка peeker имеет такое же сообщение об ошибке? – bluss
Нет, я, должно быть, смутил это чем-то другим. –
.peekable() - это адаптер, поэтому он пытается вывести 'self.src' и вставлять его сам по себе, предоставляя вам новый итератор. Это не похоже на то, что вы хотите. Вы можете даже .clone() итератор Chars вместо этого, если хотите посмотреть вперед. – bluss