ではこの>>76の構造体MyIterのnext()は誰がいつ呼ぶのでしょう?
ここではメソッドチェーンになっているので後続のイテレータが呼びます
具体的には>>75で v.my_iter().my_print(); でしたからmy_print()が呼び出します

そこで関数my_print()の定義です
今回もtraitの部分はおまじないと思って無視していいです
trait MyPrint {
 fn my_print(&mut self);
}
下記で任意のイテレータに対して関数my_print()を実装(impl)します
そのためこの部分だけはジェネリック指定『<I: Iterator>』のコードをご容赦ください
後ろのwhere以降の std::fmt::Display は表示を許可するためのおまじないと思ってください
impl<I: Iterator> MyPrint for I
 where I::Item: std::fmt::Display
{
 fn my_print(&mut self) {
  while let Some(val) = self.next() {
   println!("{}", val);
  }
 }
}
ここでmy_print()のselfというのはここでimpl対象=先行するイテレータすなわちMyIterになります
もちろんMyIter以外の別のイテレータに対してもこのmy_print()は機能します
今回の使い方ではselfは構造体MyIterになりますから
whileのところにあるself.next()も先程定義したMyIterのnext()になります
next()の返り値が Some である限りprintln!で表示して None になるとwhileを抜けて終了です

以上で冒頭の以下の例の全てコードが実装されましたので動きます
fn main() {
 let v = vec![5, 6, 7, 8, 9];
 v.my_iter().my_print();
}