Memory management 是否在结构字段中借用检查值?
所以我有了一个小小的解析器,我在写它的时候玩得很开心。但我听说堆分配是个魔鬼(或多或少),为了达到喜剧效果,它可能被夸大了 示例1.rsMemory 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
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)->TransferLex.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 _ => ~""
...