修改Option的值并获取引用

时间:2014-07-26 17:21:43

标签: enums rust

我有一个可变变量是一个Option,我想:

  • 将其替换为Some,只有它是None(并且我不想在所有情况下都传递默认值,因为它已经是Some,因为它涉及分配)
  • 然后获取对包含值的引用

现在,我用伪代码跟着这个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。

2 个答案:

答案 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);
}

try it out

我怀疑你是否能够做一些更简洁的事情。

答案 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());
}