Rust 使用联合收割机的锈蚀所有权和使用寿命

Rust 使用联合收割机的锈蚀所有权和使用寿命,rust,Rust,我已经阅读了关于所有权和生命周期的文档,我想我理解它们,但是我在特定的代码方面遇到了问题 我有一个名为分支的结构,如下所示: struct Branch { slot: u8, yaw: u8, pitch: u8, length: u8 } let hex_re = Regex:new(r"[0-9a-fA-F]").unwrap(); let hex = || find(&hex_re).map(|s| u8::from_str_radix(s, 1

我已经阅读了关于所有权和生命周期的文档,我想我理解它们,但是我在特定的代码方面遇到了问题

我有一个名为分支的结构,如下所示:

struct Branch {
    slot: u8,
    yaw: u8,
    pitch: u8,
    length: u8
}
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 } )
}
我正在使用
combine
库(它是解析器组合器)将字符串解析为分支。解析器如下所示:

struct Branch {
    slot: u8,
    yaw: u8,
    pitch: u8,
    length: u8
}
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。第二个分支将3个十六进制字符映射到一个分支中,例如3d2

当我调用解析器
分支(1)时,问题就出现了。parse(“3d2”)
,编译器报告一个错误
“length”的寿命不够长。我想我理解这个错误,如果我没有弄错的话,那是因为当闭包完成时
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<&regex::Regex, &str>, [closure@src\lsystem.rs:26:37: 26:70]>, combine::combinator::Map<combine::regex::Find<&regex::Regex, &str>, [closure@src\lsystem.rs:26:37: 26:70]>, combine::combinator::Map<combine::regex::Find<&regex::Regex, &str>, [closure@src\lsystem.rs:26:37: 26:70]>, combine::combinator::Map<combine::regex::Find<&regex::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]>`
表达式类型包含在表达式中无效的引用:`combine::combinator::Map`
我不知道这个错误是怎么回事。任何帮助都将不胜感激。

这解决了问题:

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 } )
}

将move放在第二个.map上是有效的。

在第一个示例中,
length:u8
意味着没有生存期(它每次都被复制),如果没有生存期,那么错误就在别处……奇怪的是,编译器抱怨
length
的生存时间不够长。该错误的行位于
.map(|(槽,偏航,俯仰)|分支{槽,偏航,俯仰,长度})
上。如果长度只是被复制,为什么它会抱怨它的寿命不够长?你能在完整的错误中进行编辑吗?和a?没有它,任何答案都必须投入大量的努力来重现这个问题。