gpt4 book ai didi

rust - 函数参数的特征不匹配

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

我有一段可以编译的 Rust 代码和一段非常相似但不能编译的代码。

有效的方法:

pub fn do_something(_: Box<Iterator<Item = f64>>) {}

fn main() {
let iter = Box::new(vec![1.0].into_iter());
do_something(iter);
}

失败的那个:

pub fn do_something(_: Box<Box<Iterator<Item = f64>>>) {}

fn main() {
let iter = Box::new(Box::new(vec![1.0].into_iter()));
do_something(iter);
}

区别在于我有一个 Box<Box<..>>而不是 Box<..>

我收到以下错误:

error[E0308]: mismatched types
--> src/main.rs:5:18
|
5 | do_something(iter);
| ^^^^ expected trait std::iter::Iterator, found struct `std::vec::IntoIter`
|
= note: expected type `std::boxed::Box<std::boxed::Box<std::iter::Iterator<Item=f64> + 'static>>`
found type `std::boxed::Box<std::boxed::Box<std::vec::IntoIter<{float}>>>`

我将此错误解释为“IntoIter 不具有特征 Iterator”.. 但它具有。有什么问题?

最佳答案

你不能强制一个Box<Box<I>>进入 Box<Box<Iterator<Item = f64>>> , 出于 this question 中讨论的原因, 但你可以强制内部 Box :

pub fn do_something(_: Box<Box<Iterator<Item = f64>>>) {}

fn main() {
let iter = Box::new(Box::new(vec![1.0].into_iter()) as Box<Iterator<Item = f64>>);
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
do_something(iter);
}

Playground .

这是有效的,因为类型转换是 coercion site .通过写 as Box<Iterator<Item = f64>> ,您是在向编译器暗示它应该尝试使左侧的表达式适合该类型,而不是推断 Box<IntoIter<f64>> ,因为一旦它被包裹在“外部”Box ,您无法再更改它。

或者(但不太清楚),您可以制作 Box::new(...)通过显式参数化 Box 的强制网站:

    let iter = Box::<Box<Iterator<Item = f64>>>::new(Box::new(vec![1.0].into_iter()));

哪个有效地做同样的事情。

关于rust - 函数参数的特征不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48218224/

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