【发布时间】:2021-01-16 15:13:16
【问题描述】:
我有一个围绕 &str 的包装器来维护一个不变量。当我尝试返回一个新的包装器时,该包装器基本上将由参数包装的相同数据包装到函数中
(playground),我得到“无法返回值引用函数参数s”
struct MyStrWrapper<'a> {
raw: &'a str,
}
impl AsRef<str> for MyStrWrapper<'_> {
fn as_ref(&self) -> &str {
&self.raw
}
}
fn my_function<'inp>(s: MyStrWrapper<'inp>) -> MyStrWrapper<'inp> {
MyStrWrapper {
raw: &s.as_ref()[1..],
}
}
索引与错误无关,但当我使用s.raw 而不是通过as_ref() 直接访问成员时,它可以工作。有没有一种好方法可以使raw 对my_function 不可见?
【问题讨论】:
-
在这种情况下,您不能使用
AsRef,因为my_function会消耗s,而as_ref()返回的内容的生命周期仅存在于my_function调用期间。因此,当s被删除时,as_ref()返回的内容无效。如果你改为借用s,即s: &'imp MyStrWrapper<'imp>,那么你的代码就可以工作了。
标签: generics rust reference lifetime borrow-checker