trait C where
Self: std::fmt::Debug,
{
fn who_am_i(&self) -> String {
format!("I am a {:?}", self)
}
}
#[derive(Debug)]
struct A;
impl C for A {}
#[derive(Debug)]
struct B;
impl C for B {}
fn either_a_or_b(is_a: bool) -> Box<dyn C> {
if is_a {
Box::new(A)
} else {
Box::new(B)
}
}
fn main() {
let c= either_a_or_b(true);
println!("{}", c.who_am_i());
let c= either_a_or_b(false);
println!("{}", c.who_am_i());
}
评论区
写评论找到共性,定义一个父trait,然后用父trait约束,我的想法是这样的。
是说这个?
假设允许了这么做,那么怎么去调用这个 trait 对象呢?
亲,一个函数的返回值只能有一种类型,要么是A,要么是B, 不可能是A|B。所以,你要找到A与B的共性C,用trait C来表达。
唔,我的问题表述的不够清晰.类似于这样:
大约是这样的语法, 希望T只要实现了a或者b的trait即可.
亲,你是不是想写一个函数,其返回值是两种类型中的一种,但是不想用enum, 想通过trait来实现?代码如下:
Rust的dyn相当于虚表 https://juejin.cn/post/6872898487244029960
另外可以过一遍死灵书,了解内存布局,再看这些特性会快一点 https://nomicon.purewhite.io/
函数返回Box尖括号dyn Trait尖括号
https://mp.weixin.qq.com/s/YBynjOI6A_1NMqYPUFbo_w
你的问题和描述都很奇怪。
首先,trait 不是类型,正确的说法是实现某 trait 的类型。
其次,trait 已经是泛型范畴,不明白你说的用泛型做法是什么意思。
最后,无论在哪提问,请尽可能从 MWE (minimum working example)开始,大多数人不会喜欢解决一个描述得很空洞的问题。