20次重大发布
0.23.0 | 2024年7月13日 |
---|---|
0.21.0 | 2024年5月18日 |
0.18.0 | 2024年3月22日 |
0.3.0 | 2023年10月28日 |
#175 in 算法
2,922 每月下载量
用于 63 个crate(3 直接使用)
22KB
508 行
模块 :: interval_adapter
整数区间适配器,适用于Range和RangeInclusive。
假设你有一个应该接受Interval的函数。但是你不想限制函数的调用者只能使用半开区间 core::ops::Range
或封闭区间 core::ops::RangeInclusive
,你想允许使用任意的可迭代区间。为了使这顺利工作,请使用IterableInterval
。core::ops::Range
和 core::ops::RangeInclusive
都实现了该特性,还可以与非可迭代的区间一起工作,如(-无穷大 .. +无穷大)。
基本用例
use interval_adapter::IterableInterval;
fn f1( interval : impl IterableInterval )
{
for i in interval
{
println!( "{i}" );
}
}
// Calling the function either with
// half-open interval `core::ops::Range`.
f1( 0..=3 );
// Or closed one `core::ops::RangeInclusive`.
f1( 0..4 );
更多灵活性
如果你需要更灵活地定义区间,可以将端点的元组转换为区间。
use interval_adapter::{ IterableInterval, IntoInterval, Bound };
fn f1( interval : impl IterableInterval )
{
for i in interval
{
println!( "{i}" );
}
}
// Calling the function either with
// half-open interval `core::ops::Range`.
f1( 0..=3 );
// Or closed one `core::ops::RangeInclusive`.
f1( 0..4 );
// Alternatively you construct your custom interval from a tuple.
f1( ( 0, 3 ).into_interval() );
f1( ( Bound::Included( 0 ), Bound::Included( 3 ) ).into_interval() );
// All the calls to the function `f1`` perform the same task,
// and the output is exactly identical.
非可迭代区间
你也可以使用该crate来指定非可迭代的区间。非可迭代区间有一个或多个未界定的端点。例如,区间 core::ops::RangeFull
没有界限,表示从负无穷大到正无穷大的范围。
use interval_adapter::{ NonIterableInterval, IntoInterval, Bound };
fn f1( interval : impl NonIterableInterval )
{
println!( "Do something with this {:?} .. {:?} interval", interval.left(), interval.right() );
}
// Iterable/bound interval from tuple.
f1( ( Bound::Included( 0 ), Bound::Included( 3 ) ).into_interval() );
// Non-iterable/unbound interval from tuple.
f1( ( Bound::Included( 0 ), Bound::Unbounded ).into_interval() );
// Non-iterable/unbound interval from `core::ops::RangeFrom`.
f1( 0.. );
// Non-iterable/unbound interval from `core::ops::RangeFull`
// what is ( -Infinity .. +Infinity ).
f1( .. );
将此添加到你的项目中
cargo add interval_adaptor
从仓库尝试
git clone https://github.com/Wandalen/wTools
cd wTools
cargo run --example interval_adapter_trivial