我有这两种类型:
pub struct A;
pub struct B;
以下特征:
pub trait MyTrait {}
和一个免费的功能:
fn do_something(mut element: impl MyTrait) { ... }
我想根据 impl
背后的真实类型,根据当前函数调用中的元素类型做一些不同的事情。
// pseudo-snippet
match element {
A => do something with A,
B => do something with B
}
在 Rust 中是否可以确定 impl
语句背后的类型?或者,至少,根据 impl
制定一些基于决策的工作流程(if-else 分支、模式匹配...)?
最佳答案
实现此目的的方法是向 MyTrait
添加一个方法,它执行您想要的两种不同的操作,或者返回一个您可以匹配的 enum
。
pub trait MyTrait {
fn do_something(self);
}
没有任何机制可以按照您的意思直接对具体类型进行分支。从技术上讲,您可以使用 std::any::TypeId
来实现它,但您不应该 — 因为您正在击败静态检查,这使得您的程序中的错误(未处理正确的类型集)有可能被延迟到运行时。相反,通过将功能放入 MyTrait
,您的程序具有这样的属性:如果某些类型实现了 MyTrait
,则必然定义什么 do_something
应该处理那个特征。
关于rust - 用于在 impl 语句上获取所需类型的模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73871671/