分类: 语言教程

let-else 在解构嵌套 Result 时的提前返回与借用冲突规避

在 Rust 里解析配置、处理网络响应、读取嵌套 JSON 时,最常见的写法是 match 里套 match,层层缩进之后,真正的业务逻辑被推到屏幕右侧。Rust 1.65 稳定了 let-else,它把「匹配成功就绑定变量、失败就立刻离开当前控制流」这段样板代码压缩成一行。但很多人把它当成语法糖直接套到嵌套 Result 上,随后撞上两类硬伤:一是 els

Option 的 ok_or 与 ok_or_else 在错误构造开销上的选择原则

把 Option<T> 转成 Result<T, E> 时,ok_or 和 ok_or_else 是编译器提示里出现频率最高的一对方法。多数人凭直觉选:错误值简单就用 ok_or,需要格式化就用 ok_or_else。这个直觉方向没错,但理由常常说不清,于是代码里出现两种极端:一种是无脑全用 ok_or,在热路径上白白构造了一个立刻被

映射类型中 keyof 索引访问与 as 子句重映射键名的推导边界

在 TypeScript 里处理对象类型转换时,keyof、索引访问 T[K] 和 as 子句几乎总是一起出现。看起来只是三行泛型,实际写进项目里却经常出现两种极端:要么推导结果是 never,要么 as 把键名重映射成了 string 这种宽类型,导致下游类型守卫全部失效。本文围绕这三个语法点的交互边界展开,用可运行的代码片段说明什么时候能推导、什么时候会

dataclass 中 init=False 与 default_factory 组合构造派生字段

在 Python 的日常开发里,@dataclass 几乎是定义数据载体的默认选择。但很多人只用到「声明字段、自动生成 __init__」这一步,一旦遇到「字段需要由其他字段计算得来」的场景,就退回去手写 __init__,把 dataclass 带来的简洁性丢掉了。更常见的情况是:给派生字段写了一个 field(init=False),然后直接赋值 fie

impl Trait 返回位置与 dyn Trait 装箱在 trait 对象分发上的取舍

写 Rust 的人几乎都会卡在同一个岔路口:trait 有了,实现也有好几个,接下来是把函数签名写成 -> impl Trait,还是写成 -> Box<dyn Trait>?两者在调用方看起来差不多,都能"返回一个实现了该 trait 的东西",但它们在类型系统层面走的是两条完全不同的路:前者是编译期单体化(monomorphiza