Как отобразить строку в структуру? - PullRequest
1 голос
/ 01 октября 2019

У меня есть некоторые структуры, такие как:

pub struct A {}

pub struct B {}

Я хочу отобразить эти структуры на отображение строк:

let s = match x {
    "a" => A {},
    "b" => B {},
    _ => panic!()
} 

, как в Python dict. Как я могу сделать это в Rust?

1 Ответ

4 голосов
/ 01 октября 2019

Ржавчина не похожа на Python. В Rust вы должны знать размер всех ваших объектов в стеке во время компиляции. Если нет, то вы должны использовать динамические объекты, которые размещены в куче.

В C ++ или аналогичных языках вы создадите базовый класс, в котором оба ваших класса наследуют его. Таким образом, вы можете динамически создавать объект во время выполнения с типом, который вы выбираете в зависимости от условий выполнения. Это классический способ работы.

В Rust альтернатива называется «объектами черты», где оба ваших класса реализуют одну и ту же черту (так что черта играет роль базового класса). Вот как вы это делаете:

trait C {}

impl C for A {}

impl C for B {}

pub struct A {}

pub struct B {}

fn main() {
    println!("Hello, world!");
    let x = "a";
    let s: Box<dyn C> = match x {
        "a" => Box::new(A {}),
        "b" => Box::new(B {}),
        _ => panic!()
    };
}

Box - безопасный контейнер для указателя, который будет освобожден при выходе из этой области (если вы не решите передать его в другое место).

Играйте с этим кодом на детской площадке

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