深入RUST標準庫內核(三 基本Trait)—Range

本書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)極具沖擊力的代碼是牢。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市陕截,隨后出現(xiàn)的幾起案子驳棱,更是在濱河造成了極大的恐慌,老刑警劉巖农曲,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件社搅,死亡現(xiàn)場離奇詭異,居然都是意外死亡乳规,警方通過查閱死者的電腦和手機形葬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來暮的,“玉大人笙以,你說我怎么就攤上這事《潮纾” “怎么了猖腕?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵拆祈,是天一觀的道長。 經(jīng)常有香客問我倘感,道長放坏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任老玛,我火速辦了婚禮淤年,結果婚禮上,老公的妹妹穿的比我還像新娘逻炊。我一直安慰自己互亮,他們只是感情好,可當我...
    茶點故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布余素。 她就那樣靜靜地躺著豹休,像睡著了一般。 火紅的嫁衣襯著肌膚如雪桨吊。 梳的紋絲不亂的頭發(fā)上威根,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天,我揣著相機與錄音视乐,去河邊找鬼洛搀。 笑死,一個胖子當著我的面吹牛佑淀,可吹牛的內容都是我干的留美。 我是一名探鬼主播,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼伸刃,長吁一口氣:“原來是場噩夢啊……” “哼谎砾!你這毒婦竟也來了?” 一聲冷哼從身側響起捧颅,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤景图,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后碉哑,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體挚币,經(jīng)...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年扣典,在試婚紗的時候發(fā)現(xiàn)自己被綠了妆毕。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,567評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡贮尖,死狀恐怖设塔,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情远舅,我是刑警寧澤闰蛔,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站图柏,受9級特大地震影響序六,放射性物質發(fā)生泄漏。R本人自食惡果不足惜蚤吹,卻給世界環(huán)境...
    茶點故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一例诀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧裁着,春花似錦繁涂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至桶雀,卻和暖如春矿酵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背矗积。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工全肮, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人棘捣。 一個月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓辜腺,卻偏偏與公主長得像,于是被迫代替她去往敵國和親乍恐。 傳聞我的和親對象是個殘疾皇子评疗,可洞房花燭夜當晚...
    茶點故事閱讀 45,585評論 2 359

推薦閱讀更多精彩內容