<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/rss.xsl" type="text/xsl"?><rss version="2.0"><channel><title>不报错的坑</title><description>记录 AI 编程工具的实际使用过程 —— 装了什么、怎么配、哪里踩坑、哪些说法经不起实测。内容以自己动手验证过的为准。</description><link>https://doudou.bj.cn/</link><language>zh-cn</language><item><title>[Rust 教程] 并发与 Send / Sync</title><link>https://doudou.bj.cn/rust/advanced/concurrency/</link><guid isPermaLink="true">https://doudou.bj.cn/rust/advanced/concurrency/</guid><description>「无畏并发」的实际含义是数据竞争变成编译错误 —— 而它用的不是新机制，就是所有权和借用那两套规则</description><pubDate>Mon, 14 Sep 2026 02:38:00 GMT</pubDate><category>Rust 教程</category></item><item><title>[Rust 教程] 智能指针与内部可变性</title><link>https://doudou.bj.cn/rust/advanced/smart-pointers/</link><guid isPermaLink="true">https://doudou.bj.cn/rust/advanced/smart-pointers/</guid><description>Box / Rc / RefCell —— 借用规则没有被取消，只是检查从编译期挪到了运行期，而代价是 panic</description><pubDate>Mon, 14 Sep 2026 02:38:00 GMT</pubDate><category>Rust 教程</category></item><item><title>[Rust 教程] 迭代器与闭包</title><link>https://doudou.bj.cn/rust/advanced/iterators-closures/</link><guid isPermaLink="true">https://doudou.bj.cn/rust/advanced/iterators-closures/</guid><description>三个 Fn trait 由闭包怎么用环境决定，而迭代器是惰性的 —— 不 collect 就什么都不会发生</description><pubDate>Mon, 14 Sep 2026 02:38:00 GMT</pubDate><category>Rust 教程</category></item><item><title>[Rust 教程] Vec、HashMap 与字符串的三种形态</title><link>https://doudou.bj.cn/rust/engineering/collections/</link><guid isPermaLink="true">https://doudou.bj.cn/rust/engineering/collections/</guid><description>标准库最常用的几个容器，以及 String / &amp;str / char / u8 到底各在什么层面</description><pubDate>Mon, 14 Sep 2026 02:25:43 GMT</pubDate><category>Rust 教程</category></item><item><title>[Rust 教程] 模块、crate 与 workspace</title><link>https://doudou.bj.cn/rust/engineering/modules/</link><guid isPermaLink="true">https://doudou.bj.cn/rust/engineering/modules/</guid><description>mod / use / pub 的可见性规则 —— 重点是那条不对称：子模块能看见父模块的私有项，反过来不行</description><pubDate>Mon, 14 Sep 2026 02:25:43 GMT</pubDate><category>Rust 教程</category></item><item><title>[Rust 教程] 测试与 cargo test</title><link>https://doudou.bj.cn/rust/engineering/testing/</link><guid isPermaLink="true">https://doudou.bj.cn/rust/engineering/testing/</guid><description>单元测试、集成测试、文档测试 —— Rust 把测试放进了语言本身，而</description><pubDate>Mon, 14 Sep 2026 02:25:43 GMT</pubDate><category>Rust 教程</category></item><item><title>[Rust 教程] Cargo 与工程骨架</title><link>https://doudou.bj.cn/rust/basics/cargo/</link><guid isPermaLink="true">https://doudou.bj.cn/rust/basics/cargo/</guid><description>cargo new 出来的那几个文件各是什么，check / build / run 的分工，以及怎么把编译器版本钉死</description><pubDate>Mon, 14 Sep 2026 02:16:00 GMT</pubDate><category>Rust 教程</category></item><item><title>[Rust 教程] 可变性、shadowing 与常量</title><link>https://doudou.bj.cn/rust/basics/mutability/</link><guid isPermaLink="true">https://doudou.bj.cn/rust/basics/mutability/</guid><description>`mut` 修饰的是绑定，不是类型也不是字段 —— 想清楚这一点，后面借用那一章会顺很多</description><pubDate>Mon, 14 Sep 2026 02:16:00 GMT</pubDate><category>Rust 教程</category></item><item><title>[Rust 教程] 语法速通：给已经会编程的人</title><link>https://doudou.bj.cn/rust/basics/syntax-speedrun/</link><guid isPermaLink="true">https://doudou.bj.cn/rust/basics/syntax-speedrun/</guid><description>不讲「什么是循环」—— 只讲和你已经会的那门语言不一样的地方，一篇顶别处七篇</description><pubDate>Mon, 14 Sep 2026 02:16:00 GMT</pubDate><category>Rust 教程</category></item><item><title>[Rust 教程] 为什么是 Rust：既没有 GC，也不用手动 free</title><link>https://doudou.bj.cn/rust/basics/why-rust/</link><guid isPermaLink="true">https://doudou.bj.cn/rust/basics/why-rust/</guid><description>这一篇不教语法，讲取舍 —— Rust 在哪几个地方做了和你会的那门语言不同的选择，以及你为此付什么、换到什么</description><pubDate>Mon, 14 Sep 2026 02:01:11 GMT</pubDate><category>Rust 教程</category></item><item><title>[Rust 教程] 泛型、trait 与 dyn</title><link>https://doudou.bj.cn/rust/types/traits/</link><guid isPermaLink="true">https://doudou.bj.cn/rust/types/traits/</guid><description>静态分发和动态分发的区别，以及「什么时候不得不用 dyn」那个唯一的硬理由</description><pubDate>Sat, 12 Sep 2026 10:47:15 GMT</pubDate><category>Rust 教程</category></item><item><title>[Rust 教程] Result 与 ?：没有异常怎么活</title><link>https://doudou.bj.cn/rust/types/result/</link><guid isPermaLink="true">https://doudou.bj.cn/rust/types/result/</guid><description>错误是值不是控制流 —— 以及 `?` 除了提前返回，还悄悄做了一次类型转换</description><pubDate>Sat, 12 Sep 2026 10:18:51 GMT</pubDate><category>Rust 教程</category></item><item><title>[Rust 教程] Option：没有 null 怎么活</title><link>https://doudou.bj.cn/rust/types/option/</link><guid isPermaLink="true">https://doudou.bj.cn/rust/types/option/</guid><description>它就是一个带两个变体的普通 enum —— 而正因为它没有魔法，null 那一整类 bug 才消失得这么彻底</description><pubDate>Sat, 12 Sep 2026 10:11:59 GMT</pubDate><category>Rust 教程</category></item><item><title>[Rust 教程] 模式匹配：match 不只是 switch</title><link>https://doudou.bj.cn/rust/types/pattern-matching/</link><guid isPermaLink="true">https://doudou.bj.cn/rust/types/pattern-matching/</guid><description>穷尽性检查是 enum 全部价值的兑现方式 —— 而一个 `_` 就能把它安静地作废</description><pubDate>Sat, 12 Sep 2026 10:02:32 GMT</pubDate><category>Rust 教程</category></item><item><title>[Rust 教程] struct 与 enum：把状态说清楚</title><link>https://doudou.bj.cn/rust/types/struct-enum/</link><guid isPermaLink="true">https://doudou.bj.cn/rust/types/struct-enum/</guid><description>Rust 的 enum 不是 C 的枚举，它能装数据 —— 于是「不可能的状态」可以被做成编译不出来的状态</description><pubDate>Sat, 12 Sep 2026 09:52:53 GMT</pubDate><category>Rust 教程</category></item><item><title>[Rust 教程] 什么时候就该 clone</title><link>https://doudou.bj.cn/rust/ownership/when-to-clone/</link><guid isPermaLink="true">https://doudou.bj.cn/rust/ownership/when-to-clone/</guid><description>与借用检查器搏斗到第三个小时，正确答案往往是 clone —— 这一篇讲怎么判断是哪一种情况</description><pubDate>Sat, 12 Sep 2026 09:39:44 GMT</pubDate><category>Rust 教程</category></item><item><title>[正则表达式] 一个需求走完全程</title><link>https://doudou.bj.cn/regex/practice/walkthrough/</link><guid isPermaLink="true">https://doudou.bj.cn/regex/practice/walkthrough/</guid><description>从「提取 Markdown 链接」这个真实需求出发，把分析、写、测、发现边界、加固、知道何时停手走一遍</description><pubDate>Sat, 12 Sep 2026 09:17:08 GMT</pubDate><category>正则表达式</category></item><item><title>[Rust 教程] 切片：借用一段，而不是整个</title><link>https://doudou.bj.cn/rust/ownership/slices/</link><guid isPermaLink="true">https://doudou.bj.cn/rust/ownership/slices/</guid><description>和 String 到底什么关系，为什么函数参数几乎总该写 &amp;str —— 以及 UTF-8 在这里埋的两个坑</description><pubDate>Sat, 12 Sep 2026 09:16:25 GMT</pubDate><category>Rust 教程</category></item><item><title>[Rust 教程] 生命周期标注到底在说什么</title><link>https://doudou.bj.cn/rust/ownership/lifetimes/</link><guid isPermaLink="true">https://doudou.bj.cn/rust/ownership/lifetimes/</guid><description>那些 &lt;&apos;a&gt; 不是在延长什么，它们只是在陈述一件编译器自己推不出来的事</description><pubDate>Sat, 12 Sep 2026 08:50:33 GMT</pubDate><category>Rust 教程</category></item><item><title>[Rust 教程] 借用：&amp; 与 &amp;mut 的两条规则</title><link>https://doudou.bj.cn/rust/ownership/borrow/</link><guid isPermaLink="true">https://doudou.bj.cn/rust/ownership/borrow/</guid><description>不转移所有权地用一下 —— 以及为什么「同时只能有一个可变借用」这条看起来这么狠的规则，其实在替你挡掉一整类 bug</description><pubDate>Sat, 12 Sep 2026 08:32:16 GMT</pubDate><category>Rust 教程</category></item><item><title>[正则表达式] 常用模式速查</title><link>https://doudou.bj.cn/regex/practice/cookbook/</link><guid isPermaLink="true">https://doudou.bj.cn/regex/practice/cookbook/</guid><description>一组经过实跑验证的常用正则 —— 每条都写清局限，抄之前先读那一栏</description><pubDate>Sat, 12 Sep 2026 07:57:34 GMT</pubDate><category>正则表达式</category></item><item><title>[正则表达式] 方言差异：JS / Python / grep</title><link>https://doudou.bj.cn/regex/practice/dialects/</link><guid isPermaLink="true">https://doudou.bj.cn/regex/practice/dialects/</guid><description>从网上抄来的正则粘进别的语言就不工作 —— 这一篇讲清楚差在哪，以及粘贴之前该做什么</description><pubDate>Sat, 12 Sep 2026 07:57:34 GMT</pubDate><category>正则表达式</category></item><item><title>[正则表达式] 让同事读懂，也让机器测得了</title><link>https://doudou.bj.cn/regex/practice/engineering/</link><guid isPermaLink="true">https://doudou.bj.cn/regex/practice/engineering/</guid><description>长正则怎么拆、怎么给正则写测试、code review 该看哪几项 —— 把「能跑」变成「能维护」</description><pubDate>Sat, 12 Sep 2026 07:57:34 GMT</pubDate><category>正则表达式</category></item><item><title>[正则表达式] 正则不工作怎么查</title><link>https://doudou.bj.cn/regex/practice/debugging/</link><guid isPermaLink="true">https://doudou.bj.cn/regex/practice/debugging/</guid><description>一套能照着走的排查顺序 —— 从「确认你跑的是你以为的那条」开始，而不是盯着模式硬看</description><pubDate>Sat, 12 Sep 2026 07:01:18 GMT</pubDate><category>正则表达式</category></item><item><title>[正则表达式] 10 分钟写出你的第一条正则</title><link>https://doudou.bj.cn/regex/foundation/first-regex/</link><guid isPermaLink="true">https://doudou.bj.cn/regex/foundation/first-regex/</guid><description>不讲理论，用一个真实任务走完「认符号 → 写出来 → 跑通」，只需要认识四个东西</description><pubDate>Sat, 12 Sep 2026 06:19:02 GMT</pubDate><category>正则表达式</category></item><item><title>[Rust 教程] 移动：赋值为什么会让变量失效</title><link>https://doudou.bj.cn/rust/ownership/move/</link><guid isPermaLink="true">https://doudou.bj.cn/rust/ownership/move/</guid><description>一次赋值之后原变量就不能用了 —— 这是 Rust 最先劝退人的地方，也是全部规则的起点</description><pubDate>Sat, 12 Sep 2026 06:06:26 GMT</pubDate><category>Rust 教程</category></item><item><title>[正则表达式] 字符与字符类</title><link>https://doudou.bj.cn/regex/foundation/characters/</link><guid isPermaLink="true">https://doudou.bj.cn/regex/foundation/characters/</guid><description>`.`、`[]`、`\d\w\s` —— 以及否定字符类里那个几乎人人踩过的坑</description><pubDate>Fri, 11 Sep 2026 11:15:23 GMT</pubDate><category>正则表达式</category></item><item><title>[正则表达式] 正则引擎在干什么</title><link>https://doudou.bj.cn/regex/foundation/how-it-works/</link><guid isPermaLink="true">https://doudou.bj.cn/regex/foundation/how-it-works/</guid><description>从左往右逐个位置尝试、走不通就退回岔路口换条路 —— 后面所有「它为什么匹配到奇怪的东西」都回到这个模型</description><pubDate>Fri, 11 Sep 2026 11:08:19 GMT</pubDate><category>正则表达式</category></item><item><title>[正则表达式] 什么时候不该用正则</title><link>https://doudou.bj.cn/regex/practice/when-not-to-use/</link><guid isPermaLink="true">https://doudou.bj.cn/regex/practice/when-not-to-use/</guid><description>HTML、嵌套、递归结构，以及灾难性回溯（ReDoS）—— 正则能力的边界在哪</description><pubDate>Fri, 11 Sep 2026 09:47:46 GMT</pubDate><category>正则表达式</category></item><item><title>[正则表达式] 实战：校验、提取、替换</title><link>https://doudou.bj.cn/regex/practice/validate-extract-replace/</link><guid isPermaLink="true">https://doudou.bj.cn/regex/practice/validate-extract-replace/</guid><description>三类真实需求各自的写法侧重，以及为什么「完美的邮箱正则」是个陷阱</description><pubDate>Fri, 11 Sep 2026 09:32:20 GMT</pubDate><category>正则表达式</category></item><item><title>[正则表达式] 修饰符</title><link>https://doudou.bj.cn/regex/practice/flags/</link><guid isPermaLink="true">https://doudou.bj.cn/regex/practice/flags/</guid><description>`g i m s u y` 六个，重点是 `g` 带来的 lastIndex 状态 —— JS 独有，最容易写出间歇性 bug</description><pubDate>Fri, 11 Sep 2026 09:26:08 GMT</pubDate><category>正则表达式</category></item><item><title>[正则表达式] 先行与后行</title><link>https://doudou.bj.cn/regex/structure/lookaround/</link><guid isPermaLink="true">https://doudou.bj.cn/regex/structure/lookaround/</guid><description>`(?=) (?!) (?&lt;=) (?&lt;!)` —— 只约束位置、不消耗字符，所以它们不出现在匹配结果里</description><pubDate>Fri, 11 Sep 2026 09:13:01 GMT</pubDate><category>正则表达式</category></item><item><title>[正则表达式] 选择分支与优先级</title><link>https://doudou.bj.cn/regex/structure/alternation/</link><guid isPermaLink="true">https://doudou.bj.cn/regex/structure/alternation/</guid><description>`|` 的优先级低到超出直觉 —— `^a|b$` 的意思和你以为的不一样，而括号是控制它的唯一办法</description><pubDate>Fri, 11 Sep 2026 08:25:11 GMT</pubDate><category>正则表达式</category></item><item><title>[正则表达式] 分组、捕获与反向引用</title><link>https://doudou.bj.cn/regex/structure/groups/</link><guid isPermaLink="true">https://doudou.bj.cn/regex/structure/groups/</guid><description>`()` 同时在做两件事 —— 把多个字符当整体加量词，以及把匹配到的内容存下来备用</description><pubDate>Fri, 11 Sep 2026 08:18:50 GMT</pubDate><category>正则表达式</category></item><item><title>[正则表达式] 位置：锚点与零宽</title><link>https://doudou.bj.cn/regex/structure/anchors/</link><guid isPermaLink="true">https://doudou.bj.cn/regex/structure/anchors/</guid><description>`^ $ \b` 匹配的是位置不是字符；`m` 会悄悄改掉 `^` 的含义，而 `\b` 对中文完全无效</description><pubDate>Fri, 11 Sep 2026 08:11:11 GMT</pubDate><category>正则表达式</category></item><item><title>[正则表达式] 量词与贪婪/懒惰</title><link>https://doudou.bj.cn/regex/foundation/quantifiers/</link><guid isPermaLink="true">https://doudou.bj.cn/regex/foundation/quantifiers/</guid><description>量词回答「重复几次」，但它默认尽可能多拿 —— 这是「我的正则匹配到了一大坨东西」最常见的原因</description><pubDate>Fri, 11 Sep 2026 07:58:53 GMT</pubDate><category>正则表达式</category></item><item><title>[算法教程] 排序全景</title><link>https://doudou.bj.cn/algo/array-basic/sorting-overview/</link><guid isPermaLink="true">https://doudou.bj.cn/algo/array-basic/sorting-overview/</guid><description>十种排序摆在一张表里比。重点不是背复杂度，是三件事：稳定性到底影响什么、为什么比较排序快不过 O(n log n)、以及选择排序为什么在已排好的数组上一点也不快。</description><pubDate>Tue, 08 Sep 2026 02:54:03 GMT</pubDate><category>算法教程</category></item><item><title>[Agent 开发] 权限审批的判据：什么该问，什么不该问</title><link>https://doudou.bj.cn/agent/permission-sandbox/permission-approval-criteria/</link><guid isPermaLink="true">https://doudou.bj.cn/agent/permission-sandbox/permission-approval-criteria/</guid><description>把「审批次数」当指标第一步就错了 —— 0 次审批是靠放过 rm 买来的；真正该数的是同一个意图被问了几遍。</description><pubDate>Tue, 08 Sep 2026 02:20:54 GMT</pubDate><category>Agent 开发</category></item><item><title>[算法教程] 回溯与 DFS 到底差在哪</title><link>https://doudou.bj.cn/algo/traverse-view/backtracking-vs-dfs/</link><guid isPermaLink="true">https://doudou.bj.cn/algo/traverse-view/backtracking-vs-dfs/</guid><description>差的只有一个位置：操作写在 for 循环里面还是外面。这一个位置决定了你能碰到的是树枝还是节点。</description><pubDate>Tue, 08 Sep 2026 02:08:24 GMT</pubDate><category>算法教程</category></item><item><title>[算法教程] 状态机 DP</title><link>https://doudou.bj.cn/algo/subproblem-view/dp-state-machine/</link><guid isPermaLink="true">https://doudou.bj.cn/algo/subproblem-view/dp-state-machine/</guid><description>股票买卖六道题其实是同一道。把「持有 / 不持有」当成状态、把买卖当成状态之间的边，六道题只是这张图上多几个点、多几条边。</description><pubDate>Mon, 07 Sep 2026 13:18:11 GMT</pubDate><category>算法教程</category></item></channel></rss>