gpt4 book ai didi

rust - `fold` 方法无法在特征对象上调用

转载 作者:行者123 更新时间:2023-11-29 07:52:52 28 4
gpt4 key购买 nike

我正在尝试实现一个通用的缺点列表,它比本书第 15 章中使用的列表更高级:

use std::fmt::Debug;

#[derive(Debug)]
enum List<T> {
Nil,
Cons(T, Box<List<T>>),
}

impl<T> List<T>
where
T: Debug,
{
fn from_iterable(iterator: &Iterator<Item = T>) -> Self {
iterator.fold(List::Nil, |acc, value| List::Cons(value, Box::new(acc)))
}
}

fn main() {
println!("{:?}", List::from_iterable(&(1..10)));
}

( playground )

我的代码无法编译,并且有一条非常令人困惑的消息:

error: the `fold` method cannot be invoked on a trait object
--> src/main.rs:14:18
|
14 | iterator.fold(List::Nil, |acc, value| List::Cons(value, Box::new(acc)))
| ^^^^

这条消息是什么意思?

我看到了这个以某种方式相关的 question , 但即使这个是重复的,我目前的知识也太有限,无法将这些点联系起来。

最佳答案

你有一个更大的问题。您已接受对不可变特征对象的引用。这意味着您不能调用 Iterator::next,迭代器上最原始的操作:

impl<T> List<T>
where
T: Debug,
{
fn from_iterable(iterator: &dyn Iterator<Item = T>) -> Self {
iterator.next();
panic!();
}
}
error[E0596]: cannot borrow `*iterator` as mutable, as it is behind a `&` reference
--> src/main.rs:16:9
|
15 | fn from_iterable(iterator: &dyn Iterator<Item = T>) -> Self {
| ----------------------- help: consider changing this to be a mutable reference: `&mut dyn std::iter::Iterator<Item = T>`
16 | iterator.next();
| ^^^^^^^^ `iterator` is a `&` reference, so the data it refers to cannot be borrowed as mutable

如果您遵循此错误建议并更新调用站点以传入可变引用,则您的代码有效:

impl<T> List<T>
where
T: Debug,
{
fn from_iterable(iterator: &mut dyn Iterator<Item = T>) -> Self {
iterator.fold(List::Nil, |acc, value| List::Cons(value, Box::new(acc)))
}
}

fn main() {
println!("{:?}", List::from_iterable(&mut (1..10)));
}

但是,针对此类问题使用特征对象是很常见的,因为它们涉及动态调度和一些(少量)运行时开销。相反,将静态分派(dispatch)与泛型结合使用更为常见:

impl<T> List<T>
where
T: Debug,
{
fn from_iterable(iterator: impl IntoIterator<Item = T>) -> Self {
iterator
.into_iter()
.fold(List::Nil, |acc, value| List::Cons(value, Box::new(acc)))
}
}

fn main() {
println!("{:?}", List::from_iterable(1..10));
}

我也切换到IntoIterator因为它对调用者来说更符合人体工程学。

另见:

关于rust - `fold` 方法无法在特征对象上调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48833009/

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