Использование * в передаче аргумента функции

Рейтинг: 0Ответов: 0Опубликовано: 20.03.2023

Например, есть код (сильно упрощённый пример парсера):

#[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: примеры пытался предельно сокращать, но получилось, наверное, всё равно длинно.

Ответы

Ответов пока нет.