我已经阅读了有关所有权和有效期的文档,我想我理解它们,但我遇到了一些特定代码的问题。
我有一个名为Branch
的结构,如下所示:
struct Branch {
slot: u8,
yaw: u8,
pitch: u8,
length: u8
}
我使用combine
库(它是一个解析器组合器)将字符串解析为分支。解析器看起来像这样:
let hex_re = Regex:new(r"[0-9a-fA-F]").unwrap();
let hex = || find(&hex_re).map(|s| u8::from_str_radix(s, 16));
let branch = |length: u8| {
(hex(), hex(), hex())
.map( |t| (t.0.unwrap(), t.1.unwrap(), t.2.unwrap()) )
.map( |(slot,yaw,pitch)| Branch { slot, yaw, pitch, length } )
}
解析器非常简单,第一个hex
采用与单个十六进制字符匹配的正则表达式并将其映射到u8。第二个branch
将3个十六进制字符映射到分支,例如3D2。
当我调用解析器branch(1).parse("3d2")
时出现问题,编译器报告错误'length' does not live long enough
。我想我理解这个错误,如果我没有弄错,因为length
在闭包完成时超出了范围,所以length
变量被解除分配,即使它仍然是被新创建的分支机构使用。
所以,我试图通过将length: u8
转换为length: &u8
来解决这个问题:
let branch = |len: &u8| {
(hex(), hex(), hex())
.map( |t| (t.0.unwrap(), t.1.unwrap(), t.2.unwrap()) )
.map( |(slot,yaw,pitch)| Branch { slot, yaw, pitch, length: *len } )
};
// calling the parser
branch(&(1 as u8)).parse("3d2");
但是这导致了这个错误:
type of expression contains references that are not valid during the expression: `combine::combinator::Map<combine::combinator::Map<(combine::combinator::Map<combine::regex::Find<®ex::Regex, &str>, [closure@src\lsystem.rs:26:37: 26:70]>, combine::combinator::Map<combine::regex::Find<®ex::Regex, &str>, [closure@src\lsystem.rs:26:37: 26:70]>, combine::combinator::Map<combine::regex::Find<®ex::Regex, &str>, [closure@src\lsystem.rs:26:37: 26:70]>, combine::combinator::Map<combine::regex::Find<®ex::Regex, &str>, [closure@src\lsystem.rs:26:37: 26:70]>), [closure@src\lsystem.rs:30:19: 30:65]>, [closure@src\lsystem.rs:31:19: 31:80 length:&&u8]>`
我不知道这个错误是什么。任何帮助将不胜感激。
答案 0 :(得分:0)
这解决了它:
let hex_re = Regex:new(r"[0-9a-fA-F]").unwrap();
let hex = || find(&hex_re).map(|s| u8::from_str_radix(s, 16));
let branch = |length: u8| {
(hex(), hex(), hex())
.map( |t| (t.0.unwrap(), t.1.unwrap(), t.2.unwrap()) )
.map( move |(slot,yaw,pitch)| Branch { slot, yaw, pitch, length } )
}
将移动放在第二个.map上。