gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:27:40 25 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/59476676/

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