我如何更改要引用的对象,同时仍然能够对其求值并访问其字段?

时间:2019-07-05 16:35:31

标签: rust

我正在尝试在图形上实现深度优先搜索。

# This will restart the computer. Then delay 2 seconds. 
# Then wait for PowerShell to become available again. 
# It will also timeout after 300 seconds (5 mins).
Restart-Computer -Wait -For PowerShell -Timeout 300 -Delay 2

逻辑是拥有一个指向当前节点的指针,然后对其进行扩展,将其指针更新为该扩展节点的左子节点,然后在该指针下的节点满足某些条件时继续操作。但是,我无法使用借用的引用逻辑正确执行此操作。我目前的最佳尝试是:

PS C:\>Restart-Computer -ComputerName "Server01" -Wait -For PowerShell -Timeout 300 -Delay 2

    This command restarts the Server01 remote computer and then waits up to 5 minutes (300 seconds) 
    for Windows PowerShell to be available on the restarted computer before it continues.

产生的错误:

#[derive(Debug)]
struct Interval {
    low: f64,
    high: f64,
    size: f64,
    left: Option<Box<Interval>>,
    right: Option<Box<Interval>>,
}

impl Interval {
    pub fn new(low: f64, high: f64) -> Self {
        Interval {
            low,
            high,
            left: None,
            right: None,
            size: high - low,
        }
    }

    pub fn expand(&mut self) {
        self.left = Option::Some(Box::new(Interval::new(self.low, self.low + self.size / 2.)));

        self.right = Option::Some(Box::new(Interval::new(
            self.low + self.size / 2.,
            self.high,
        )));
    }
}

如何更改我要引用的对象,同时仍然能够评估该对象上的表达式并访问其字段?

1 个答案:

答案 0 :(得分:1)

对main的以下更改应该起作用:

fn main() {
    let mut current_node: &mut Interval = &mut Interval::new(1., 2.);

    while current_node.left.as_ref().expect("PANIC").size > 0.01 {
        current_node.expand();
        current_node = current_node.left.as_mut().expect("PANIC");
    }

    println!("Deep down: {:?}", current_node);
}

expect按值取舍,因此它尝试消耗current_node.left,供以后使用,Option::as_ref()返回引用原始值的新Option Option,然后可以在不破坏原始值的情况下使用它。除可变性差异外,相同的逻辑适用于将as_mut添加到第二个调用。