实例化时的递归限制(未使用?)Rust类型

时间:2019-03-01 11:26:48

标签: rust

我在Rust中实现了worstsort

fn bubblesort<T: PartialOrd>(l: &mut [T]) {
    for i in 1..l.len() {
        for j in 0..l.len() - i {
            if l[j + 1] < l[j] {
                l.swap(j + 1, j);
            }
        }
    }
}

fn permutations<T: Clone>(l: &[T]) -> Vec<Vec<T>> {
    if l.len() <= 1 {
        return vec![l.to_vec()];
    }

    let mut res = Vec::new();
    for i in 0..l.len() {
        let mut lcopy = l.to_vec();
        lcopy.remove(i);
        let p = permutations(&lcopy);
        for perm in p {
            let mut fullperm = vec![l[i].clone()];
            fullperm.extend(perm);
            res.push(fullperm);
        }
    }
    res
}

pub fn badsort<T: PartialOrd + Clone>(k: usize, l: &mut [T]) {
    if k == 0 {
        bubblesort(l);
    } else {
        let mut p = permutations(l);
        badsort(k - 1, &mut p);
        l.clone_from_slice(&p[0]);
    }
}

pub fn worstsort<T, F>(l: &mut [T], f: F)
where
    T: PartialOrd + Clone,
    F: FnOnce(usize) -> usize,
{
    badsort(f(l.len()), l);
}

#[cfg(test)]
mod tests {
    use super::*;
    #[test]
    fn badsort_zero() {
        let mut unsorted = vec![8, 3, 5];
        badsort(0, &mut unsorted);
        assert_eq!(unsorted, vec![3, 5, 8]);
    }
    #[test]
    fn worstsort_id() {
        let mut unsorted = vec![8, 3, 5];
        worstsort(&mut unsorted, |n| n);
        assert_eq!(unsorted, vec![3, 5, 8]);
    }
}

它会编译并检查正常,直到我尝试编写实际调用worstsortbadsort函数的测试,而cargo test给出错误:

error: reached the recursion limit while instantiating `badsort::<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<std::vec::Vec<i32>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>`

即使在调用badsort(0, l)时也出现此错误,该badsort应该只是bubbleort,没有任何递归调用。我的假设是rustc试图为每个可能的usize生成u8的单态版本(我将类型换成#![recursion_limit="1024"]并得到了相同的错误),但是我不明白为什么:无论参数是什么,即使它根本没有递归地调用自身,它也会出错!我尝试将递归限制一直设置到u8,但即使达到 while(1){ boost::mutes::scoped_lock locker(mtx); std::cout << "A" << std::endl; // do stuff with Matrix std::cout << "B" << std::endl; mtx.unlock(); //wait for few microseconds } ,它仍然会达到此限制并失败。

我的猜测正确吗?有没有办法让这个(公认是错误的)代码编译并完全运行?

0 个答案:

没有答案