本書(shū)github鏈接:inside-rust-std-library
前面章節(jié)參見(jiàn):
深入RUST標(biāo)準(zhǔn)庫(kù)內(nèi)核(序言) - 簡(jiǎn)書(shū) (jianshu.com)
深入RUST標(biāo)準(zhǔn)庫(kù)內(nèi)核(一 概述) - 簡(jiǎn)書(shū) (jianshu.com)
深入RUST標(biāo)準(zhǔn)庫(kù)內(nèi)核(二 內(nèi)存)—Layout/原生指針 - 簡(jiǎn)書(shū) (jianshu.com)
深入RUST標(biāo)準(zhǔn)庫(kù)內(nèi)核(二 內(nèi)存)—NonNull<T>/申請(qǐng)及釋放 - 簡(jiǎn)書(shū) (jianshu.com)
深入RUST標(biāo)準(zhǔn)庫(kù)內(nèi)核(二 內(nèi)存)—mem模塊/MaybeUninit<T> - 簡(jiǎn)書(shū) (jianshu.com)
深入RUST標(biāo)準(zhǔn)庫(kù)內(nèi)核 (三 基礎(chǔ)Trait) 編譯器內(nèi)置Trait - 簡(jiǎn)書(shū) (jianshu.com)
深入RUST標(biāo)準(zhǔn)庫(kù)內(nèi)核(三 基礎(chǔ)Trait)— Ops Trait - 簡(jiǎn)書(shū) (jianshu.com)
深入RUST標(biāo)準(zhǔn)庫(kù)內(nèi)核(三 基本Trait)—Range - 簡(jiǎn)書(shū) (jianshu.com)
深入RUST標(biāo)準(zhǔn)庫(kù)內(nèi)核(三 基礎(chǔ)Trait)—Index Trait - 簡(jiǎn)書(shū) (jianshu.com)
深入RUST標(biāo)準(zhǔn)庫(kù)內(nèi)核(四 Iterator 實(shí)現(xiàn))— Range實(shí)現(xiàn) - 簡(jiǎn)書(shū) (jianshu.com)
深入RUST標(biāo)準(zhǔn)庫(kù)內(nèi)核(四 Iterator)— Slice實(shí)現(xiàn) - 簡(jiǎn)書(shū) (jianshu.com)
深入RUST標(biāo)準(zhǔn)庫(kù)內(nèi)核(四 Iterator 實(shí)現(xiàn))— str及array實(shí)現(xiàn) - 簡(jiǎn)書(shū) (jianshu.com)
Iterator的適配器代碼分析
Map 適配器代碼分析
Map相關(guān)代碼如下:
pub trait Iterator {
//其他內(nèi)容
...
...
//創(chuàng)建map Iterator
fn map<B, F>(self, f: F) -> Map<Self, F>
where
Self: Sized,
F: FnMut(Self::Item) -> B,
{
Map::new(self, f)
}
...
}
//此結(jié)構(gòu)是一個(gè)adapter的結(jié)構(gòu)
pub struct Map<I, F> {
// Map的底層Iterator
pub(crate) iter: I,
// Map操作閉包函數(shù)
f: F,
}
impl<I, F> Map<I, F> {
//由Iterator::map 函數(shù)和這個(gè)函數(shù)可以理解Iterator的lazy特性,
//Iterator的創(chuàng)建實(shí)際上僅僅建立了數(shù)據(jù)結(jié)構(gòu),直到next才有操作粮坞。
pub(in crate::iter) fn new(iter: I, f: F) -> Map<I, F> {
Map { iter, f }
}
}
//針對(duì)Map實(shí)現(xiàn)Iterator
impl<B, I: Iterator, F> Iterator for Map<I, F>
where
F: FnMut(I::Item) -> B,
{
type Item = B;
fn next(&mut self) -> Option<B> {
//利用底層Iterator的next肪凛,Option::map實(shí)現(xiàn)next
self.iter.next().map(&mut self.f)
}
fn size_hint(&self) -> (usize, Option<usize>) {
self.iter.size_hint()
}
//其他函數(shù)固蚤,其實(shí)現(xiàn)技巧與next類似
...
...
}
Chain 適配器代碼分析
相關(guān)代碼如下:
pub trait Iterator {
...
...
//創(chuàng)建Chain Iterator
fn chain<U>(self, other: U) -> Chain<Self, U::IntoIter>
where
Self: Sized,
U: IntoIterator<Item = Self::Item>,
{
Chain::new(self, other.into_iter())
}
...
...
}
pub struct Chain<A, B> {
a: Option<A>,
b: Option<B>,
}
impl<A, B> Chain<A, B> {
pub(in super::super) fn new(a: A, b: B) -> Chain<A, B> {
Chain { a: Some(a), b: Some(b) }
}
}
macro_rules! fuse {
($self:ident . $iter:ident . $($call:tt)+) => {
//$iter可能已經(jīng)被置為None
match $self.$iter {
//若$iter不為None,則調(diào)用iter的系列函數(shù)
Some(ref mut iter) => match iter.$($call)+ {
//函數(shù)返回None
None => {
//設(shè)置$iter為None,并返回None
$self.$iter = None;
None
}
//其他返回函數(shù)返回值
item => item,
},
//a為None時(shí)返回None
None => None,
}
};
}
//與fuse類似沉帮,略
macro_rules! maybe {
($self:ident . $iter:ident . $($call:tt)+) => {
match $self.$iter {
Some(ref mut iter) => iter.$($call)+,
None => None,
}
};
}
impl<A, B> Iterator for Chain<A, B>
where
A: Iterator,
B: Iterator<Item = A::Item>,
{
type Item = A::Item;
fn next(&mut self) -> Option<A::Item> {
//先執(zhí)行self.a.next
match fuse!(self.a.next()) {
//若self.a.next返回None饲漾,則執(zhí)行self.b.next
None => maybe!(self.b.next()),
//不為None姻氨,返回a的返回值
item => item,
}
}
...
...
}
其他
Iterator的adapter還有很多钓辆,如StedBy, Filter, Zip, Intersperse等等。具體請(qǐng)參考標(biāo)準(zhǔn)庫(kù)手冊(cè)∏傲基本上所有的adapter都是遵循Adapter的設(shè)計(jì)模式來(lái)實(shí)現(xiàn)的功戚。
小結(jié)
RUST的Iterater的adapter是突出的體現(xiàn)RUST的語(yǔ)法優(yōu)越性的特性,借助Trait和強(qiáng)大的泛型機(jī)制似嗤,與c/c++/java/python/go相比較啸臀,RUST以很少的代碼在標(biāo)準(zhǔn)庫(kù)就實(shí)現(xiàn)了最豐富的adapter。而其他語(yǔ)言往往需要語(yǔ)言基礎(chǔ)之上的框架去支持烁落,會(huì)導(dǎo)致額外的學(xué)習(xí)努力乘粒。
函數(shù)式編程的基礎(chǔ)框架之一便是基于Iterator和閉包實(shí)現(xiàn)豐富的adapter。這也凸顯了RUST在語(yǔ)言級(jí)別對(duì)函數(shù)式編程的良好支持伤塌。