如何将字符串映射到结构体?

Man*_*pta 1 rust

我有一些结构,例如:

pub struct A {}

pub struct B {}
Run Code Online (Sandbox Code Playgroud)

我想将这些结构映射到字符串映射:

let s = match x {
    "a" => A {},
    "b" => B {},
    _ => panic!()
} 
Run Code Online (Sandbox Code Playgroud)

就像 Python 字典一样。我怎样才能在 Rust 中做到这一点?

The*_*ist 5

Rust 与 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!()
    };
}
Run Code Online (Sandbox Code Playgroud)

Box是指针的安全容器,当您退出此范围时,它将被释放(除非您选择将其传递到其他地方)。

在操场上玩这个代码