gpt4 book ai didi

Rust:在默认方法实现中返回特征对象

转载 作者:行者123 更新时间:2023-12-02 01:30:28 24 4
gpt4 key购买 nike

当尝试从特征内的默认实现返回特征对象时,例如

trait Foo {
fn foo(self: Box<Self>) -> Box<dyn Foo> {
self
}
}

Rust 编译器提示

error[E0277]: the size for values of type `Self` cannot be known at compilation time
note: required for the cast to the object type `dyn Foo`

类型转换应来自 Box<Self>Box<dyn Foo> ,为什么这需要调整 Self 的大小?

最佳答案

不可能将未调整大小的类型转换为特征对象,因为这将迫使它同时拥有两组元数据。

考虑这段代码:

trait Foo: 'static {
fn foo(self: Box<Self>) -> Box<dyn Foo> {
self
}
}

trait Bar {}

impl Foo for dyn Bar {}

impl Foo for i32 {}

impl<T> Bar for T {}

fn main() {
let boxed = Box::new(42);
boxed.foo();

let boxed: Box<dyn Bar> = Box::new(42);
boxed.foo();
}

在这种情况下,没有什么可以禁止最后一次调用 - 所有签名都允许它。但是,如果我们强制Box<dyn Bar>Box<dyn Foo>dyn Bar 的虚拟函数表在哪里?去? (当然,在这种情况下它是空的,但它仍然必须存在 - 空特征并不特殊)

如果添加 where Self: Sizedfoo但是,最后一个调用被正确拒绝:

error: the `foo` method cannot be invoked on a trait object
--> src/main.rs:20:11
|
2 | fn foo(self: Box<Self>) -> Box<dyn Foo> where Self: Sized {
| ----- this has a `Sized` requirement
...
20 | boxed.foo();
| ^^^

关于Rust:在默认方法实现中返回特征对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73411895/

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