gpt4 book ai didi

rust - 使用Result::map和Box时无法推断类型

转载 作者:行者123 更新时间:2023-12-03 07:57:02 24 4
gpt4 key购买 nike

为什么不编译?

trait T {}

fn f<U: 'static + T, V, E>(f2: V) -> impl Fn() -> Result<Box<dyn T>, E>
where
V: Fn() -> Result<U, E>,
{
move || -> Result<Box<dyn T>, E> { f2().map(Box::new) }
}

错误消息是:

error[E0308]: mismatched types
--> src/lib.rs:7:40
|
7 | move || -> Result<Box<dyn T>, E> { f2().map(Box::new) }
| ^^^^^^^^^^^^^^^^^^ expected trait T, found type parameter
|
= note: expected type `std::result::Result<std::boxed::Box<(dyn T + 'static)>, _>`
found type `std::result::Result<std::boxed::Box<U>, _>`
= help: type parameters must be constrained to match other types
= note: for more information, visit https://doc.rust-lang.org/book/ch10-02-traits.html#traits-as-parameters

这个版本可以:

trait T {}

fn f<U: 'static + T, V, E>(f2: V) -> impl Fn() -> Result<Box<dyn T>, E>
where
V: Fn() -> Result<U, E>,
{
move || -> Result<Box<dyn T>, E> {
match f2() {
Ok(result) => Ok(Box::new(result)),
Err(e) => Err(e),
}
}
}

我认为 (dyn T + 'static)U是相同的;我对吗?

我正在使用 rustc 1.39.0-nightly (f0b58fcf0 2019-09-11)

最佳答案

这是一个限制,我不知道它是否会在一天内编译。原因是Rust不知道如何在两种Result类型之间进行转换,而(dyn T + 'static)U是完全不同的东西。如果可以接受,则可以执行f2().map(|x| Box::new(x) as _)

强制转换将使编译器在将U转换为(dyn T + 'static)之前将其放入结果中,我们不需要显式强制转换类型,编译器inference将为我们完成转换(在大多数情况下)。

A trait object can be obtained from a pointer to a concrete type that implements the trait by casting it (e.g. &x as &Foo)



请参阅本书的 dynamic dispatch部分(在新书中找不到任何信息)。

关于rust - 使用Result::map和Box时无法推断类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59994904/

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