为什么Rust中作为参数传递的&str数组会存在不同生命周期问题?
Rust 复合类型内部引用的生命周期标注问题解答
生命周期标注的核心作用是约束多个引用之间的生命周期关联规则,并不是手动为某个变量分配生命周期,只是向编译器补充它无法自动推断的引用间约束关系。
三个版本的差异原因如下:
- 无标注原版函数报错原因
Rust默认的生命周期省略规则下,函数中所有未手动标注的引用都会被分配独立、无关联的匿名生命周期。原版函数里a1数组中存储的&str,和a2数组可容纳的&str被编译器判定为生命周期完全无关,你尝试将a1的&str赋值给a2的元素,相当于把生命周期未知的引用存入有安全要求的容器,自然会触发生命周期不匹配的错误。 - 标注内部引用的版本可用原因
你给a1和a2内部存储的&str都绑定了同一个生命周期'a,相当于明确告知编译器:存入a1数组的字符串引用的生命周期,一定满足a2数组对内部元素的生命周期要求,完全符合赋值的安全条件,因此编译可以通过。 - 标注数组本身引用的版本不可用原因
这个版本里你标注的'a是「指向数组本身的引用」的生命周期,和数组内部存储的&str的生命周期没有任何关联。就好比你只给装水的箱子贴了保质期标签,却没有对箱子里的每瓶水做保质期约束,要把A箱的水放到B箱时,编译器还是无法确认水的保质期是否符合要求,自然会报错。
通用规则补充
只有当数组、结构体、枚举这类复合类型的内部字段包含引用类型时,才需要给内部的引用添加生命周期标注,约束不同引用间的生命周期关系。如果复合类型内部存储的是持有所有权的非引用类型(比如i32、String等),不需要生命周期标注,也不会触发相关编译错误。
内容的提问来源于stack exchange,提问作者jts
相关产品推荐
相关产品推荐

