< 返回版块

eric642 发表于 2021-12-26 23:36

大佬们, 假如我定义两个trait, 我希望A函数返回这两个trait中的一个就可以了. 这个应该咋写~~~ 不想用返回两个Option里包含两个trait的做法.想通过泛型的做法

评论区

写评论
NaokiLH 2021-12-27 11:43

找到共性,定义一个父trait,然后用父trait约束,我的想法是这样的。

Easonzero 2021-12-27 10:59

是说这个?

trait A {}
trait B {}

enum AorB<T, U>
where T: A, U: B
{
   A(T),
   B(U),
}

trait C {
   fn get<T, U>(key:&str) -> AorB<T, U> where T: A, U: B;
}
zhylmzr 2021-12-27 10:41

假设允许了这么做,那么怎么去调用这个 trait 对象呢?

c5soft 2021-12-27 10:02

亲,一个函数的返回值只能有一种类型,要么是A,要么是B, 不可能是A|B。所以,你要找到A与B的共性C,用trait C来表达。

作者 eric642 2021-12-27 09:44

唔,我的问题表述的不够清晰.类似于这样:

trait a {
  ......
}
trait b {
  .....,
}
trait c {
   fn get<T>(key:&str) -> T where T: a | b;
}

大约是这样的语法, 希望T只要实现了a或者b的trait即可.

c5soft 2021-12-27 09:23

亲,你是不是想写一个函数,其返回值是两种类型中的一种,但是不想用enum, 想通过trait来实现?代码如下:

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());
}

shuimuliang 2021-12-27 00:22

Rust的dyn相当于虚表 https://juejin.cn/post/6872898487244029960

另外可以过一遍死灵书,了解内存布局,再看这些特性会快一点 https://nomicon.purewhite.io/

shuimuliang 2021-12-27 00:18

函数返回Box尖括号dyn Trait尖括号

https://mp.weixin.qq.com/s/YBynjOI6A_1NMqYPUFbo_w

苦瓜小仔 2021-12-27 00:12

你的问题和描述都很奇怪。

首先,trait 不是类型,正确的说法是实现某 trait 的类型。

其次,trait 已经是泛型范畴,不明白你说的用泛型做法是什么意思。

最后,无论在哪提问,请尽可能从 MWE (minimum working example)开始,大多数人不会喜欢解决一个描述得很空洞的问题。

1 共 9 条评论, 1 页