Почему этот код Rust 'generi c' не работает должным образом? - PullRequest
2 голосов
/ 20 марта 2020

Я недавно начал изучать Rust и пытаюсь написать оценщик небольших выражений. Я практиковал Rust уже несколько дней и думал, что это круто, работать с чертами Rust. Я попытался сделать так, чтобы структуры Sum & Number реализовали черту Expression, чтобы я мог express (каламбур непреднамеренно) (1 + 2) как выражение , где слева и справа стороны тоже выражения. Я наткнулся на проблему, заключающуюся в том, что вы не можете просто использовать Черты в качестве типов свойств, поэтому вместо них вы должны использовать & dyn Trait или Box в Книге. Исходя из этого, я переписал его, и теперь он компилируется, но я не могу получить доступ к значениям внутри Sum. Вот мой код:

trait Expression {}
#[derive(Debug)]
struct Number {
    pub val: i32
}

impl Expression for Number {}

struct Sum {
    pub left: Box<dyn Expression>,
    pub right: Box<dyn Expression>
}

impl Expression for Sum {}

fn main() {
    let e = Sum{ left: Box::new(Number{ val: 2}),
                 right: Box::new(Number{ val: 2})
    };
    let sum = (2 + 2);
    println!("{:#?}", sum);
}

Я хочу получить значение Number :

e.left.val

и использовать вложенные конструкции, такие как:

Sum{Sum{Number, Sum{Number, Number}}, Number}

Я также пытался сделать явное приведение к Number:

let val = (e.left as Number).val;

Но это не удается с ошибкой: не примитивное приведение: std::boxed::Box<(dyn Expression + 'static)> as Number примечание: выражение as можно использовать только для преобразования между примитивными типами. Подумайте об использовании From черты .

Извините за любые языковые ошибки или грязное объяснение, Engli sh не мой родной язык.
Я не опытный программист и очень плохо знаком с Руст, поэтому я был бы очень признателен за любую помощь, спасибо!

Ответы [ 2 ]

0 голосов
/ 20 марта 2020

Я думаю, что вы пытаетесь сделать это ( полный код на детской площадке ):

trait Expression {
    fn evaluate(&self) -> i32;
}

impl Expression for Number {
    fn evaluate(&self) -> i32 {
        self.val
    }
}

impl Expression for Sum {
    fn evaluate(&self) -> i32 {
        self.left.evaluate() + self.right.evaluate()
    }
}
0 голосов
/ 20 марта 2020

Rust не позволяет вам разыгрывать не примитивные типы.

Ссылка: https://doc.rust-lang.org/rust-by-example/types/cast.html

...