我有一个可变变量是一个Option,我想:
现在,我用伪代码跟着这个model:
match myvar {
None => myvar = Some(…),
_ => ()
}
match myvar {
Some(ref mut inner) => { /* process */ }
_ => unreachable!()
}
我不觉得必须两次进行匹配(我希望编译器可以对其进行优化)并且具有“无法访问”,这是必需的,因为我需要返回对内部值的引用(和在无的情况下,这是不可能的。)
你知道另一种方法吗?我希望Option上有一种方法可以一次性完成,但Option只是一个枚举,在任何枚举上都有这种方法并不容易。
我做了一个人物树。
struct Node {
children : Option<HashMap<char, Node>>
}
因此,如果我在树中插入文本,第一个字符位于树的第一级,第二个字符位于第二级,等等...如果我插入字符串“phone”和“phony”,它们将会在层次结构中有4个共同的节点。
首先,我直接使用了HashMap(没有Option)。但我不想为叶子分配无用的Hashmap。所以我使用了一个Option,当添加一个叶子时我放了一个None。然后,在进一步插入字符串时,我不得不用有一些哈希映射来替换None。
答案 0 :(得分:1)
这是A.B。的回答:
fn main() {
let mut a = Some("defg".to_string());
a = a.or_else(|| Some("abcd".to_string()));
let r = a.get_mut_ref();
println!("{}", r);
}
我怀疑你是否能够做一些更简洁的事情。
答案 1 :(得分:0)
这可能是您正在寻找的。第二个Foo仅在None上分配。它还说明了如何在Option中引用对象,然后将其用于方法调用。
struct Foo;
impl Foo {
fn new() -> Foo {
println!("Creating Foo");
Foo
}
fn blub(&self) {
println!("This Foo lives at {}", self as *const Foo);
}
}
fn main() {
let mut a: Option<Foo> = Some(Foo::new());
let b = a.or_else(|| Some(Foo::new()));
b.as_ref().map(|foo| foo.blub());
}