我有一些结构,例如:
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 中做到这一点?
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是指针的安全容器,当您退出此范围时,它将被释放(除非您选择将其传递到其他地方)。
在操场上玩这个代码
| 归档时间: |
|
| 查看次数: |
1339 次 |
| 最近记录: |