Types 进入vs在线算法迭代器

Types 进入vs在线算法迭代器,types,rust,iterator,Types,Rust,Iterator,我正在写一个在线算法,用一系列函数实现,这些函数接受迭代器并生成迭代器 当我编写这样的函数时,内容更加复杂,但在类型上没有区别: fn decode<'a, T>(input: T) -> impl Iterator<Item = i16> + 'a where T: Iterator<Item = &'a u8> + 'a, { input.map(|b| i16::from(*b)).filter(|i| *i != 0) }

我正在写一个在线算法,用一系列函数实现,这些函数接受迭代器并生成迭代器

当我编写这样的函数时,内容更加复杂,但在类型上没有区别:

fn decode<'a, T>(input: T) -> impl Iterator<Item = i16> + 'a
where
    T: Iterator<Item = &'a u8> + 'a,
{
    input.map(|b| i16::from(*b)).filter(|i| *i != 0)
}

但是,这会使调用函数变得不合理:

let input: Vec<u8> = vec![1, 2, 3, 0];
let v: Vec<i16> = decode(input.iter()).collect();
我更喜欢使用T:Into-src/main.rs:1:1 | 1 |/fn解码+'静态` =注意:要了解更多信息,请访问 =注意:`std::convert::Into'需要` 为什么会这样,还有更好的方法吗?

改用:

错误[E0277]:编译时无法知道'dyn std::iter::Iterator+'static'类型的值的大小 ->src/lib.rs:1:12 | 1 | fn示例:迭代器{} |^在编译时没有已知的大小 | =帮助:特性'std::marker::Sized'未为'dyn std::iter::Iterator+'静态实现` =注意:要了解更多信息,请访问 =注意:所有局部变量必须具有静态已知的大小 =帮助:未设置大小的局部变量被选通为不稳定的功能 定义如下:

pub trait Into<T> {
    fn into(self) -> T;
}
实现到的东西必须具有函数fn intoself->dyn Iterator,返回一个trait。由于trait没有大小,因此它还不能返回、存储在变量中或作为参数接受

另见:

改用:

错误[E0277]:编译时无法知道'dyn std::iter::Iterator+'static'类型的值的大小 ->src/lib.rs:1:12 | 1 | fn示例:迭代器{} |^在编译时没有已知的大小 | =帮助:特性'std::marker::Sized'未为'dyn std::iter::Iterator+'静态实现` =注意:要了解更多信息,请访问 =注意:所有局部变量必须具有静态已知的大小 =帮助:未设置大小的局部变量被选通为不稳定的功能 定义如下:

pub trait Into<T> {
    fn into(self) -> T;
}
实现到的东西必须具有函数fn intoself->dyn Iterator,返回一个trait。由于trait没有大小,因此它还不能返回、存储在变量中或作为参数接受

另见:


我理解您的示例为什么fn-ax:Iterator不起作用,但我看不到连接。我的.into调用是否创建了一个无大小的类型?无论如何,IntoIterator确实解决了我的问题;谢谢@LeonoraTindall我的.into调用是否创建未大小的类型?-是的。我理解你的例子为什么fn-ax:Iterator不起作用,但我看不到这种联系。我的.into调用是否创建了一个无大小的类型?无论如何,IntoIterator确实解决了我的问题;谢谢@LeonoraTindall我的.into调用是否创建未大小的类型?-对
fn example(x: Iterator<Item = ()>) {}
pub trait Into<T> {
    fn into(self) -> T;
}