Memory management 是否在结构字段中借用检查值?

Memory management 是否在结构字段中借用检查值?,memory-management,rust,Memory Management,Rust,所以我有了一个小小的解析器,我在写它的时候玩得很开心。但我听说堆分配是个魔鬼(或多或少),为了达到喜剧效果,它可能被夸大了 示例1.rs pub结构解析 } 枚举转移{ 发布fn make(src:R)->Lex Transfer{ 示例:rs:15{ 示例.rs:16 src:&'a src 示例:rs:17} 示例:rs:18} 示例。rs:14:40:18:6注:……但借用值仅对14:39的区块有效 示例.rs:14发布fn make(src:R)->Lex{ 示例.rs:21 let l

所以我有了一个小小的解析器,我在写它的时候玩得很开心。但我听说堆分配是个魔鬼(或多或少),为了达到喜剧效果,它可能被夸大了

示例1.rs

pub结构解析
}
枚举转移{
发布fn make(src:R)->Lex Transfer{
示例:rs:15{
示例.rs:16 src:&'a src
示例:rs:17}
示例:rs:18}
示例。rs:14:40:18:6注:……但借用值仅对14:39的区块有效
示例.rs:14发布fn make(src:R)->Lex{
示例.rs:21 let line=match self.src.read_line(){
示例rs:22正常(行)=>{
示例:rs:23行
例如:rs:24},
示例。rs:25=>~“”
...
示例.rs:20:47:29:6注:……但借用值仅对20:46的区块有效

示例.rs:20发布fn结果(&mut self)->Transfer
Lex.make
:问题是您正在按值获取
R
。也就是说,您正在使用它。在函数末尾,它被释放。因此,对它的引用无效。您需要做的是将
和'a R
作为参数,而不是
R

Lex.results
read\u line()
返回
Result
。再次返回对象(这次是
~str
)是在方法内部拥有的,因此一旦到达方法的末尾,它将在超出范围时被释放。因此,您不能使用引用,您只需将
~str
传递回调用方即可,无需附加终身担忧

以下是最终代码:

pub结构解析
}
枚举转移{
结果(~str)
}
发布结构法{

pub fn make(src:&'ar)->LexHm,如果使用
self.src.read\u char()会有什么变化
并将字符推入一个
str
?我是否能够发出一个
Transfer
枚举并具有一个生命周期
&str
?@DanielFath:从结构上考虑一下:这样的字符串必然会在
fn results
范围内创建;因此,它必须被置于更大范围内(
self
是唯一的选项)或被拥有。因此,不,您将无法使用
&str
发出
传输。
example.rs:16:18: 16:25 error: `src` does not live long enough
example.rs:16             src: &'a src
                               ^~~~~~~
example.rs:14:40: 18:6 note: reference must be valid for the lifetime &'a  as defined on the block at 14:39...
example.rs:14     pub fn make(src : R) -> Lex<'a, R> {
example.rs:15         Lex {
example.rs:16             src: &'a src
example.rs:17         }
example.rs:18     }
example.rs:14:40: 18:6 note: ...but borrowed value is only valid for the block at 14:39
example.rs:14     pub fn make(src : R) -> Lex<'a, R> {
example.rs:15         Lex {
example.rs:16             src: &'a src
example.rs:17         }
example.rs:18     }
example.rs:21:26: 21:34 error: cannot borrow immutable dereference of `&`-pointer `*self.src` as mutable
example.rs:21         let line = match self.src.read_line() {
                                       ^~~~~~~~
example.rs:27:19: 27:23 error: `line` does not live long enough
example.rs:27         let brw = line.as_slice();
                                ^~~~
example.rs:20:47: 29:6 note: reference must be valid for the lifetime &'a  as defined on the block at 20:46...
example.rs:20     pub fn results(&mut self) -> Transfer<'a> {
example.rs:21         let line = match self.src.read_line() {
example.rs:22             Ok(line) => {
example.rs:23                 line
example.rs:24             },
example.rs:25             _ => ~""
              ...
example.rs:20:47: 29:6 note: ...but borrowed value is only valid for the block at 20:46
example.rs:20     pub fn results(&mut self) -> Transfer<'a> {
example.rs:21         let line = match self.src.read_line() {
example.rs:22             Ok(line) => {
example.rs:23                 line
example.rs:24             },
example.rs:25             _ => ~""
              ...