Использование * в передаче аргумента функции
Например, есть код (сильно упрощённый пример парсера):
#[derive(Debug)]
enum Token {
SYMBOL(char),
BRACKET,
}
fn parse(toks: &Vec<Token>) {
let mut code_in_brackets: Vec<Token> = vec![];
let mut in_brackets = false;
for tok in toks {
match tok {
Token::BRACKET => {
if in_brackets {
in_brackets = false;
parse(&code_in_brackets);
code_in_brackets.clear();
}
},
Token::SYMBOL(ch) => {
if in_brackets {
code_in_brackets.push(tok);
}
}
}
}
}
fn main() {
let tokens = vec![
Token::SYMBOL('a'),
Token::BRACKET,
Token::SYMBOL('b'),
Token::SYMBOL('c'),
Token::BRACKET,
];
parse(&tokens);
}
Компилятор выдает ошибку:
error[E0308]: mismatched types
--> src\main.rs:22:43
|
22 | code_in_brackets.push(tok);
| ---- ^^^ expected enum `Token`, found `&Token`
| |
| arguments to this function are incorrect
|
note: associated function defined here
--> C:\Users\****\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib/rustlib/src/rust\library\alloc\src\vec\mod.rs:1830:12
|
1830 | pub fn push(&mut self, value: T) {
| ^^^^
Если попробовать так:
// ...
Token::SYMBOL(ch) => {
if in_brackets {
code_in_brackets.push(*tok); // ставим `*`
}
}
// ...
Ошибка такая:
error[E0507]: cannot move out of `*tok` which is behind a shared reference
--> src\main.rs:22:43
|
22 | code_in_brackets.push(*tok);
| ^^^^ move occurs because `*tok` has type `Token`, which does not implement the `Copy` trait
For more information about this error, try `rustc --explain E0507`.
error: could not compile `hello_cargo` due to previous error; 1 warning emitted
PS: примеры пытался предельно сокращать, но получилось, наверное, всё равно длинно.
Источник: Stack Overflow на русском