本書github鏈接:
inside-rust-std-library
前面章節(jié)參見:
深入RUST標準庫內核(序言) - 簡書 (jianshu.com)
深入RUST標準庫內核(一 概述) - 簡書 (jianshu.com)
深入RUST標準庫內核(二 內存)—Layout/原生指針 - 簡書 (jianshu.com)
深入RUST標準庫內核(二 內存)—NonNull<T>/申請及釋放 - 簡書 (jianshu.com)
深入RUST標準庫內核(二 內存)—mem模塊/MaybeUninit<T> - 簡書 (jianshu.com)
深入RUST標準庫內核 (三 基礎Trait) 編譯器內置Trait - 簡書 (jianshu.com)
深入RUST標準庫內核(三 基礎Trait)— Ops Trait - 簡書 (jianshu.com)
Range 運算符代碼分析
Range是符號 .. , start..end , start.. , ..end , ..=end流济,start..=end 形式
Range相關的邊界結構Bound
源代碼:
pub enum Bound<T> {
/// An inclusive bound.
/// 邊界包括
Included(T),
/// An exclusive bound.
/// 邊界不包括
Excluded(T),
/// An infinite endpoint. Indicates that there is no bound in this direction.
/// 邊界不存在
Unbounded,
}
Include邊界的值包含篮绿,Exclued邊界的值不包含逐沙,Unbounded邊界值不存在
RangeFull
..
的數(shù)據(jù)結構眷射。
Range<Idx>
start.. end
的數(shù)據(jù)結構
RangeFrom<Idx>
start..
的數(shù)據(jù)結構
RangeTo<Idx>
.. end
的數(shù)據(jù)結構
RangeInclusive<Idx>
start..=end
的數(shù)據(jù)結構
RangeToInclusive<Idx>
..=end
的數(shù)據(jù)結構
RangeBounds<T: ?Sized>
所有Range統(tǒng)一實現(xiàn)的Trait憨颠。
pub trait RangeBounds<T: ?Sized> {
/// 獲取范圍的起始值
///
/// 例子
/// # fn main() {
/// use std::ops::Bound::*;
/// use std::ops::RangeBounds;
///
/// assert_eq!((..10).start_bound(), Unbounded);
/// assert_eq!((3..10).start_bound(), Included(&3));
/// # }
/// ```
fn start_bound(&self) -> Bound<&T>;
/// 獲取范圍的終止值.
/// 例子
/// # fn main() {
/// use std::ops::Bound::*;
/// use std::ops::RangeBounds;
///
/// assert_eq!((3..).end_bound(), Unbounded);
/// assert_eq!((3..10).end_bound(), Excluded(&10));
/// # }
/// ```
fn end_bound(&self) -> Bound<&T>;
/// 范圍是否包括某個值.
/// 例子
/// assert!( (3..5).contains(&4));
/// assert!(!(3..5).contains(&2));
///
/// assert!( (0.0..1.0).contains(&0.5));
/// assert!(!(0.0..1.0).contains(&f32::NAN));
/// assert!(!(0.0..f32::NAN).contains(&0.5));
/// assert!(!(f32::NAN..1.0).contains(&0.5));
fn contains<U>(&self, item: &U) -> bool
where
T: PartialOrd<U>,
U: ?Sized + PartialOrd<T>,
{
(match self.start_bound() {
Included(start) => start <= item,
Excluded(start) => start < item,
Unbounded => true,
}) && (match self.end_bound() {
Included(end) => item <= end,
Excluded(end) => item < end,
Unbounded => true,
})
}
}
RangeBounds針對RangeFull胞四,RangeTo, RangeInclusive, RangeToInclusive, RangeFrom, Range結構都進行了實現(xiàn)呻粹。同時針對(Bound<T>, Bound<T>)的元組做了實現(xiàn)腌巾。
Range的獨立性
Range操作符多用于與Index運算符結合或與Iterator Trait結合使用。在后繼的Index運算符和Iterator中會研究Range是如何與他們結合的辐怕。
小結
基于泛型的Range類型提供了非常好的語法手段逼蒙,只要某類型支持排序,那就可以定義一個在此類型基礎上實現(xiàn)的Range類型寄疏。再結合Index和Iterator, 將高效的實現(xiàn)極具沖擊力的代碼是牢。