Make 函数同时采用 Range 和 RangeInclusive

har*_*d65 8 range rust

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

fn takes_range(range: Range<i32>) {
    // DO SOMETING WITH RANGE
}
Run Code Online (Sandbox Code Playgroud)

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

takes_range(0..5);
Run Code Online (Sandbox Code Playgroud)

但不是

takes_range(0..=5);
Run Code Online (Sandbox Code Playgroud)

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

fn takes_range(Range<i32>) {}
fn takes_range_inclusive(RangeInclusive<i32>) {}
Run Code Online (Sandbox Code Playgroud)

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

takes_range(0..5);
takes_range(0..=5);
Run Code Online (Sandbox Code Playgroud)

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

kmd*_*eko 15

有一个RangeBounds针对所有类型都实现的特征Range。因此,您可以使您的函数具有通用性,并以该特征作为约束:

use std::ops::RangeBounds;

fn takes_range<R: RangeBounds<i32>>(range: R) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

然而,这是否真的能达到你想要的效果取决于“在范围内做某事”是什么。Rust 泛型只能访问它们所限制的内容,因此这只允许您查询范围的开始、结束以及其中是否包含值。例如,如果您想在for循环中使用它,则还需要对其进行约束IntoIterator<Item = i32>