我是 Rust 的新手,仍在与借用检查器和正确的生命周期作斗争。
这是我开始构建的一个简单的结构 - 它存储命令行参数的集合,例如事物(可以用--string
or a -c
或两者):
struct OptionMap<'a, T: 'a> {
name: HashMap<String, &'a T>,
short_name: HashMap<char, &'a T>,
options: Vec<T>
}
impl<'a, T: 'a> OptionMap<'a, T> {
pub fn new() -> OptionMap<'a, T> {
OptionMap {
name: HashMap::new(),
short_name: HashMap::new(),
options: Vec::new()
}
}
pub fn register(&mut self, name: &OptionName, option: T) {
if name.name.is_some() {
self.name.insert(name.name.unwrap().to_owned(), &option);
}
if name.short_name.is_some() {
self.short_name.insert(name.short_name.unwrap(), &option);
}
self.options.push(option);
}
}
我收到其中两个错误(每个错误一个&option
我写的参数):
Compiling glam v0.1.0 (file:///Users/carson/Projects/glam)
src/options.rs:57:66: 57:72 error: `option` does not live long enough
src/options.rs:57 self.name.insert(name.name.unwrap().to_owned(), &option);
^~~~~~
src/options.rs:54:62: 66:6 note: reference must be valid for the lifetime 'a as defined on the block at 54:61...
src/options.rs:54 pub fn register(&mut self, name: &OptionName, option: T) {
src/options.rs:55 {
src/options.rs:56 if name.name.is_some() {
src/options.rs:57 self.name.insert(name.name.unwrap().to_owned(), &option);
src/options.rs:58 }
src/options.rs:59 }
...
src/options.rs:54:62: 66:6 note: ...but borrowed value is only valid for the scope of parameters for function at 54:61
src/options.rs:54 pub fn register(&mut self, name: &OptionName, option: T) {
src/options.rs:55 {
src/options.rs:56 if name.name.is_some() {
src/options.rs:57 self.name.insert(name.name.unwrap().to_owned(), &option);
src/options.rs:58 }
src/options.rs:59 }
...
我传递对每个哈希映射的引用(因此它们借用它),然后将选项直接传递给向量以将其移动到那里,以便选项不会超出范围。
范围好像是'a
以及范围option
对我来说应该是一样的 - 因为OptionMap
是用生命周期创建的'a
, and T
也受该生的约束,并且option
搬进options
在函数的末尾。我缺少什么?我觉得我在 Rust 中不断地与一生作斗争,好像还有一些东西还没有适合我。