Rust in Everything
基于 async-stream 0.3.6

动手

前面几部分是读 async-stream 的源码,这一部分反过来:不依赖它,自己把主线的两段各写一遍。写完再回头看,Send::poll 为什么不碰 waker、Enter 为什么要恢复旧值、那句 if false { break } 为什么非有不可,都会变成你自己做过的选择。

  1. 从零写一个最小 stream!:运行时 82 行代码、proc-macro 79 行代码,只支持 yield。分三步:先手写展开结果,确认线程局部指针这条路能跑;再写 VisitMut 把 yield 改写成 send().await;最后去掉和加上标签检查各跑一次 #106 的结构:去掉时值被送进了内层的流,加上后编译报 E0767。
flowchart TB
  s1["第一步:手写展开结果"] --> rt["STORE + SendFut + MiniStream"]
  s2["第二步:proc-macro"] --> sc["Scrub:改写 yield"]
  sc --> rt
  s3["第三步:标签检查"] --> un["不检查:42 送进了内层"]
  s3 --> ck["检查:E0767"]

💬 关联讨论

发起讨论
加载中...