Make 函数接受 Range 和 RangeInclusive

Make function takes both Range and RangeInclusive

我想要一个以 Range 作为参数的函数。

fn takes_range(range: Range<i32>) {
    // DO SOMETING WITH RANGE
}

我可以像这样使用这个功能,

takes_range(0..5);

但不是

takes_range(0..=5);

我意识到有两种类型,名为 Range 和 RangeInclusive。 所以如果我想取包含范围,应该做两个函数。

fn takes_range(Range<i32>) {}
fn takes_range_inclusive(RangeInclusive<i32>) {}

然而这不是我想要的。我想同时使用 Range 和 RangeInclusive,所以我可以使用

takes_range(0..5);
takes_range(0..=5);

是否可以使我的函数采用这两种类型?

RangeBounds trait that is implemented for all the Range种类型。因此,您可以使用该特征作为约束使您的函数通用:

use std::ops::RangeBounds;

fn takes_range<R: RangeBounds<i32>>(range: R) {
    // ...
}

但是,这是否真的如您所愿,取决于 "do something with range" 是什么。 Rust 泛型只能访问它们受约束的内容,因此这只允许您查询范围的开始、结束以及是否包含值。例如,如果您想在 for 循环中使用它,您还需要限制 IntoIterator<Item = i32>