gpt4 book ai didi

rust - 如何使我自己的适配器方法能够使用特征对象?

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

我有一个特性,它具有使用该方法的“适配器方法”:

struct Bar<T>(T);

trait Foo {
fn make_bar(self) -> Bar<Self>
where
Self: Sized,
{
Bar(self)
}
}

impl Foo for u8 {}
impl Foo for bool {}

这是仿照 Iterator 设计的.当我使用 Box<Iterator> , 我仍然可以调用 Iterator适配器方法,如 mapfilter :

fn main() {
let a = vec![1, 2, 3];
let b: Box<Iterator<Item = u8>> = Box::new(a.into_iter());
let c = b.map(|x| x * 2);
for z in c {
println!("{}", z)
}
}

但是,我定义的方法的工作方式不同:

fn main() {
let a: Box<Foo> = Box::new(42);
a.make_bar();
}

失败并出现错误

error[E0277]: the trait bound `Foo: std::marker::Sized` is not satisfied
--> src/main.rs:18:7
|
18 | a.make_bar();
| ^^^^^^^^ `Foo` does not have a constant size known at compile-time
|
= help: the trait `std::marker::Sized` is not implemented for `Foo`

Foo 绝对正确没有大小 - 这是一个特征。然而,Box<Foo> 应该有一个尺寸,据我所知。什么是 Iterator与我的代码不同?

最佳答案

因为 Iterator是对象安全的,特征对象 Iterator工具 Iterator .

因为 impl<I: Iterator + ?Sized> Iterator for Box<I> , 盒装特征对象 Box<Iterator>工具 Iterator .

因此,在您的情况下,解决方案是实现 Foo对于 Box<Foo> .这可能是通用的,例如 Iterator的 ( impl<T: ?Sized + Foo> Foo for Box<T> { } ) 或者它可以是特定的 ( impl Foo for Box<Foo> { } )。

关于rust - 如何使我自己的适配器方法能够使用特征对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30633823/

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