Как шаблон сопоставить Box, чтобы получить атрибут структуры? - PullRequest
0 голосов
/ 19 сентября 2018

Я пытаюсь получить доступ к атрибуту штучной структуры внутри перечисления, но не могу понять, как сопоставить шаблон с std::boxed::Box

enum ArithExp {
    Sum {
        lhs: Box<ArithExp>,
        rhs: Box<ArithExp>,
    },
    Mul {
        lhs: Box<ArithExp>,
        rhs: Box<ArithExp>,
    },
    Num {
        value: f64,
    },
}

fn num(value: f64) -> std::boxed::Box<ArithExp> {
    Box::new(ArithExp::Num { value })
}

let mut number = num(1.0);
match number {
    ArithExp::Num { value } => println!("VALUE = {}", value),
}

Я получаю следующую ошибку:

error[E0308]: mismatched types
  --> src/main.rs:22:9
   |
22 |         ArithExp::Num { value } => println!("VALUE = {}", value),
   |         ^^^^^^^^^^^^^^^^^^^^^^^ expected struct `std::boxed::Box`, found enum `main::ArithExp`
   |
   = note: expected type `std::boxed::Box<main::ArithExp>`
              found type `main::ArithExp`

Как правильно получить доступ к атрибуту?

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Вы должны разыменовать значение в штучной упаковке, чтобы вы могли получить доступ к тому, что находится внутри коробки:

match *number {
    ArithExp::Num { value } => println!("VALUE = {}", value),
    _ => (),
}

детская площадка

0 голосов
/ 19 сентября 2018

Вам не нужно ставить enum:

fn num(value: f64) -> ArithExp {
    ArithExp::Num { value }
}

Ошибка, которую даст вам компилятор, будет связана с предоставлением остальных вариантов enum в плечах match.Вы можете либо предоставить каждого из них, либо предоставить _ руку ... что означает "что-нибудь еще":

let mut number = num(1.0);
match number {
    ArithExp::Num { value } => println!("VALUE = {}", value),
    _ => (), // do nothing if its something else
}

Здесь он работает на детской площадке

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...