Я работаю над лексером, который имеет функцию lex
, которая должна перемещать вектор отсканированных токенов в основную программу, которая затем генерирует синтаксический анализатор для анализа токенов, определяемый следующим образом:
/// ### lex
/// Pushes the tokens generated by
/// `scan_token` to `self.tokens`
fn lex(&mut self) -> Vec<Token> {
while !Self::is_at_eof(self) {
self.lexeme_start = self.lookahead;
self.tokens.push(Self::scan_token(self).unwrap());
}
self.tokens
.push(Token::new(TokenType::EOF, String::from(""), self.row));
self.tokens
}
Вектор self.tokens: Vec<Token>
должен содержать токены, определенные как
pub struct Token {
// -- snip of copyable fields --
lexeme: String, // <-- the issue
// -- snip of copyable fields --
}
Однако это не будет компилироваться, так как тип String
не реализует трейт Copy
. Как я могу вернуть этот вектор, передав право собственности вызывающей функции (например, переместить его)?
Я знаю, что эта функция не является общедоступной, поэтому ее нельзя вызвать ничем за пределами модуля, но она будет таковой после того, как я ее успешно протестирую.
self.tokens
после возвращения? - person SCappella   schedule 19.05.2020Self::is_at_eof(self)
вместоself.is_at_eof()
? - person Masklinn   schedule 19.05.2020Self::method
(синтаксис унифицированного вызова функции) полезен для передачи метода функциям более высокого порядка (если сигнатуры совпадают), но обычно вы бы прямо вызывали метод какself.<method>
. Помимо того, что он короче, он также попытается адаптироватьself
к правильному ссылочному типу. - person Masklinn   schedule 19.05.2020