我想我可能是愚蠢的,但我想不明白这件事.

我有一个函数,它接受一个泛型整数类型T,我使用该类型T创建一个范围,并希望将该范围收集到一个Vec<T>.问题是我得到了以下错误method cannot be called on RangeInclusive due to unsatisfied trait bounds.它继续说,以下特性边界没有得到满足:T: Step.

步骤std::iter::Stepcore::iter::Step都被列为不稳定.

我做了一些挖掘,它似乎还没有达到stable.他们还提到编译器错误需要修改,但没有说明如何实际做我需要做的事情.

一些示例代码:

use num_traits::int::PrimInt;

fn collect_range<T>(number: T) -> Vec<T> 
   where  T: PrimtInt + std::ops::Add<Output = T> + std::cmp::PartialOrd + Copy, {
    (T::zero()..=number).collect()  
}

错误出现在最后一行的collect().

我的问题是,这是不可能的,我需要实现其他的东西吗?

我想我可以自己循环遍历迭代器来完成它,但似乎奇怪的是Collect在这里不工作.

推荐答案

我想我可以自己循环遍历迭代器

但你不能,因为同样的原因.范围不实现Iterator除非T: Step.

原谅这个双关语,但你可以通过简单地要求RangeInclusive<T>必须实现Iterator来解决这个问题. 这也使你在T上的许多界限变得多余. 添加Iterator边界并简化现有边界给我们提供了一个工作示例:

fn collect_range<T>(number: T) -> Vec<T>
where
    T: num_traits::Zero,
    std::ops::RangeInclusive<T>: Iterator<Item = T>,
{
    (T::zero()..=number).collect()
}

这些边界也更清楚地表达了函数工作所需的条件,所以我认为它们甚至不是一个变通方法——相反,它们是基于函数工作的正确边界.

Rust相关问答推荐

通用池类型xsx

获取字符串切片(&;str)上的切片([ia..ib])返回字符串

如何实现泛型枚举的`Serde::Desialize`特性

重写Rust中的方法以使用`&;mut self`而不是`mut self`

使用Py03从Rust调用Python函数时的最佳返回类型

`Pin`有没有不涉及不安全代码的目的?

从未排序的链表中删除重复项的铁 rust 代码在ELSE分支的低级上做了什么?

将一个泛型类型转换为另一个泛型类型

使用Rust WASM读取文件

为什么rustc会自动降级其版本?

有没有一种方法可以创建一个闭包来计算Rust中具有随机系数的n次多项式?

Rust Axum 框架 - 解包安全吗?

如何展平以下嵌套的 if let 和 if 语句?

仅在运行测试时生成调试输出

如何创建递归borrow 其父/创建者的 struct ?

是否可以预测堆栈溢出?

匹配结果时的简洁日志(log)记录

带有库+多个二进制文件的Cargo 项目,二进制文件由多个文件组成?

C++ 中的 CRTP 是一种表达其他语言中特征和/或 ADT 的方法吗?

为什么 u64::trailing_zeros() 在无分支工作时生成分支程序集?