Lifetime Elision场景下两种Cursor结构体实现写法的差异
Rust中两种Cursor实现方式的区别
先给出定义的结构体:
struct Cursor<'a> { chars: Chars<'a>, }
下面是两种Cursor的实现方式,二者的核心区别在于生命周期的写法:
第一种实现(匿名生命周期)
impl Cursor<'_> { fn new(input: &str) -> Cursor { ... } }
这里使用了Rust的匿名生命周期语法'_,属于语法糖:
- 编译器会自动推导
input: &str的匿名生命周期,并将其与返回的Cursor的生命周期绑定,效果等价于隐式声明了统一的生命周期参数。 - 代码写法更简洁,无需手动声明生命周期,适合简单场景。
第二种实现(显式生命周期)
impl<'a> Cursor<'a> { fn new(input: &'a str) -> Cursor<'a> { ... } }
这里显式声明了生命周期参数'a:
- 直接明确将输入字符串的生命周期
'a,与Cursor结构体自身的生命周期、返回值的生命周期绑定,语义表达更直白。 - 可读性更强,对于不熟悉匿名生命周期的开发者,或是复杂的生命周期嵌套场景,显式标注能减少理解歧义。
核心等价性
两种写法在语义和编译结果上完全等价,编译器处理后的逻辑没有区别,都是为了确保Cursor内部持有的Chars不会超过输入字符串的生命周期,避免出现悬垂引用。
内容的提问来源于stack exchange,提问作者Klim
相关产品推荐
相关产品推荐

