gpt4 book ai didi

rust - 无法返回 Option 因为关联类型未调整大小

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

我不明白为什么这段代码不能编译:

fn main() {}

trait NotWorking {
// The associated type `Bar` must be sized
type Bar: ?Sized;

// Why does the compiler complain that Self::Bar is not sized?
// I have a trait bound that says it is!
fn notwoking() -> Option<Self::Bar>;
}

我确实有一个约束,即关联类型 Bar 必须调整大小,但编译器仍然提示它未调整大小:

error[E0277]: the trait bound `<Self as NotWorking>::Bar: std::marker::Sized` is not satisfied
--> src/main.rs:17:5
|
17 | fn notwoking() -> Option<Self::Bar>;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `<Self as NotWorking>::Bar` does not have a constant size known at compile-time
|
= help: the trait `std::marker::Sized` is not implemented for `<Self as NotWorking>::Bar`
= help: consider adding a `where <Self as NotWorking>::Bar: std::marker::Sized` bound
= note: required by `std::option::Option`

我尝试了一下,试图让它工作,并对它的工作感到惊讶(因为我们不能返回一个未确定大小的类型,我原以为它会失败):

fn main() {}

trait Working {
type Bar;

// Why does this work?
// I would expect the compiler to complain the Self::Bar is not sized
fn woking() -> Self::Bar;
}

我肯定在这里遗漏了一些重要的东西。

最佳答案

你的第二个例子是正确的。声明具有 Sized 边界的通用参数的方式是不指定任何显式边界。 Sized 的特殊之处在于默认情况下它被隐式添加为泛型参数的绑定(bind),因为没有 Sized 的情况相对不常见。如果您不想要求通用参数在编译时具有已知大小,您可以 remove this implicit bound by writing ?Sized .

另见 documentation for Sized .

关于rust - 无法返回 Option<associated type> 因为关联类型未调整大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46901760/

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