在rust中创建一个带双点操作符的迭代器需要什么trait?

mwngjboj  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(141)
use num_integer::{sqrt, Roots};
use num_traits::Unsigned;
use std::collections::BTreeMap;

pub fn prime_factorization<T: Unsigned + Roots>(n: T) -> BTreeMap<usize, T> {
    let mut map = BTreeMap::new();
    (0..=n.sqrt()).for_each(|v| {});
    map
}
error[E0308]: mismatched types
   --> src/lib.rs:93:10
    |
91  | pub fn prime_factorization<T: Unsigned + Roots>(n: T) -> BTreeMap<usize, T> {
    |                            - this type parameter
92  |     let mut map = BTreeMap::new();
93  |     (0..=n.sqrt()).for_each(|v| {});
    |      ----^^^^^^^^
    |      |   |
    |      |   expected integer, found type parameter `T`
    |      arguments to this function are incorrect
    |
    = note:        expected type `{integer}`
            found type parameter `T`

我希望能够指定usize,u16,u32等的T。我可以直接指定这些类型,但我想知道更好的方法。我应该给T加上什么界限?

zynd9foi

zynd9foi1#

如果你想在这里使用一个范围,你需要做两件事。首先,您需要某种方法将文字0转换为您的类型,因为这不能保证适用于所有类型。第二,你需要使它成为一个迭代器。
看起来像这样:

use num_integer::{sqrt, Roots};
use num_traits::Unsigned;
use std::collections::BTreeMap;
use std::iter::Iterator;
use std::ops::RangeInclusive;

pub fn prime_factorization<T: Unsigned + Roots + From<u8>>(n: T) -> BTreeMap<usize, T>
    where RangeInclusive<T>: Iterator{
    let mut map = BTreeMap::new();
    (T::from(0)..=n.sqrt()).for_each(|v| {});
    map
}

fn main() {
    prime_factorization(65536u64);
}

相关问题