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>
。
我想要一个以 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>
。