at5*_*321 1 generics casting rust
如果我有两个结构:
struct A {...}
struct B {...}
Run Code Online (Sandbox Code Playgroud)
fn f<T>(param: T)以及我通过传递对Aor的引用来调用的通用函数B,该函数中是否有一种方法可以具有类似这样的内容(伪代码):
if param is A {
// do something with "param as A", like this:
let a: A = (A) param;
// ...
}
Run Code Online (Sandbox Code Playgroud)
在 Java、C# 等语言中,我会简单地检查一个对象是否是 的实例A,如果是,则将其强制转换A为上面的示例。我怎样才能在 Rust 中做类似的事情?我知道我可以将一些特定于类型的逻辑放入特征中,但我特别要求一种更简单、更直接的方法。
您可以使用特征的特征对象来完成您所要求的操作Any,例如
use std::any::Any;
#[derive(Debug)]
struct A;
#[derive(Debug)]
struct B;
fn foo(param: &dyn Any) {
if let Some(a) = param.downcast_ref::<A>() {
dbg!(a);
}
if let Some(b) = param.downcast_ref::<B>() {
dbg!(b);
}
}
Run Code Online (Sandbox Code Playgroud)
然而,对于常见的用例,有更惯用、符合人体工程学和高效的解决方案。A您提到在您的问题中实现一个共同特征B,这是一种方法。另一种方法是定义一个枚举,其中包含您想要支持的所有类型的变体:
enum MyEnum {
A(A),
B(B),
}
fn bar(param: MyEnum) {
match param {
MyEnum::A(a) => { dbg!(a); },
MyEnum::B(b) => { dbg!(b); },
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
373 次 |
| 最近记录: |