gpt4 book ai didi

rust - 调用返回具有共享特征的不同类型并传递给其他函数的函数

转载 作者:行者123 更新时间:2023-11-29 08:29:10 24 4
gpt4 key购买 nike

我对 Rust 还是很陌生。我想使用一个变量在返回不同类型结构的几个函数之一之间进行选择,但所有这些函数都实现了相同的特征。然后我想将返回的结构从所选函数传递给一些函数,这些函数旨在接受具有该特征的任何变量。但是,我不知道该怎么做。我读过 How do I overcome match arms with incompatible types for structs implementing same trait?但我遗漏了一些东西,因为我仍然无法让它工作。我将返回值传递给的函数不接受该值 - 见下文。

这是一个使用上述链接中的方法之一的简化​​示例:

trait IsEven {
fn is_even(&self) -> bool;
}

struct First {
v: u8,
}

impl IsEven for First {
fn is_even(&self) -> bool {
self.v % 2 == 0
}
}

struct Second {
v: Vec<u8>,
}

impl IsEven for Second {
fn is_even(&self) -> bool {
self.v[0] % 2 == 0
}
}

fn make1() -> First {
First{v: 5}
}

fn make2() -> Second {
Second{v: vec![2, 3, 5]}
}


fn requires_is_even(v: impl IsEven) {
println!("{:?}", v.is_even());
}

fn main() {
for i in 0..2 {
let v1;
let v2;
let v = match i {
0 => {
v1 = make1();
&v1 as &IsEven
}
_ => {
v2 = make2();
&v2 as &IsEven
}
};
requires_is_even(v); // This is where it fails
}
}

我在这种情况下得到的错误是:

52 |         requires_is_even(v);
| ^^^^^^^^^^^^^^^^ the trait `IsEven` is not implemented for `&dyn IsEven`

我也尝试过像上面链接中的其他一些示例一样使用 Box,但仍然无法正常工作。谁能帮忙?

谢谢

鲍勃

最佳答案

requires_is_even ,如您所写,接收一个实现 IsEven 的对象按值计算,尽管特征上的所有方法都采用 self通过共享引用。然而,尽管如此,&dyn IsEven不会自动实现 IsEven (尽管我们可以自己添加该实现,请参见下文)。

这里有几个选项:

  1. 更改函数以接收实现 IsEven 的对象通过共享引用。 (此版本进行静态分派(dispatch)。)

    fn requires_is_even(v: &(impl IsEven + ?Sized)) {
    println!("{:?}", v.is_even());
    }

    注意: ?Sized绑定(bind)在这里是必需的,因为 impl Trait in argument position 是类型参数的语法糖,类型参数具有隐式 Sized绑定(bind)。

  2. 更改函数以接收 IsEven通过共享引用的特征对象。 (此版本进行动态调度。)

    fn requires_is_even(v: &dyn IsEven) {
    println!("{:?}", v.is_even());
    }
  3. 实现 IsEven对实现 IsEven 的类型的任何共享引用.

    impl<T> IsEven for &T
    where
    T: IsEven + ?Sized
    {
    fn is_even(&self) -> bool {
    (**self).is_even()
    }
    }

    注意:通过添加 ?Sized绑定(bind),这个impl适用于 &dyn IsEven以及。 Trait 对象(此处为 dyn IsEven不是 &dyn IsEvenBox<dyn IsEven>)自动实现其相应的 trait(如果 trait 为 object-safe,否则 trait 对象类型根本不可用,根据定义)。

关于rust - 调用返回具有共享特征的不同类型并传递给其他函数的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54470036/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com