rust - Rust:如何告诉借位检查员此举取决于 bool 值?

标签 rust borrow-checker unsafe-pointers

以下代码未通过借位检查器,因为Label-A使用Label-B消耗的值,但该代码实际上是安全的:Label-A由processed保护,仅在运行Label-B时才设置。
我如何才能告诉编译器依赖关系,或者如果不能,则该解决这个问题的成语是什么?
(使X Copy/Clone Not Acceptable ,也不使consume成为引用,Rc<X>都没有吸引力(数据结构已经相当复杂))


struct X(i32);

fn consume1(_x: X) {
    ()
}

fn consume2(_x: X) {
    ()
}

fn predicate(_x: &X) -> bool {
    true
}

pub fn main() {
    let xs = vec![X(1), X(2)];
    
    for x in xs {
        let mut processed = false;

        // for _ in _ {
        if predicate(&x) {
            consume1(x); // Label-B
            processed = true;
        }
        // } end for
        // this for loop here is just to show that the real code
        // is more complicated, the consume1() is actually called
        // (somehow) inside this inner loop

        // some more code
        
        if !processed {
            consume2(x);  // Label-A
        }
    }
}

最佳答案

除非我误解了,否则我认为对您来说最好的选择是使用“选项”。这样,您还可以摆脱该boolean标志。

struct X( i32 );

fn consume1( _x: X ) { }

fn consume2( _x: X ) { }

fn predicate( _x: &X ) -> bool {
    true
}

pub fn main( ) {
    let xs = vec![ Some( X( 1 ) ), Some( X( 2 ) ) ];

    for mut x in xs {
        if predicate( x.as_ref( ).unwrap( ) ) {
            consume1( x.take( ).unwrap( ) );
        }   
        if let Some( x ) = x {
            consume2( x );
        }
    }
 }

关于rust - Rust:如何告诉借位检查员此举取决于 bool 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66298424/

相关文章:

generics - 当泛型类型受到泛型生存期的限制时,这意味着什么?

types - 为什么 Rust 期望双重借用 (`&&' a mut T`)

c# - 声明指向类定义结构的指针,其中类是通用的

for-loop - `for i in &v`和 `for i in v`之间有区别吗?

generics - 当 T 没有实现 Clone 时,为什么不能为泛型 Option<T> 克隆 None?

rust - '@' 符号在 Rust 中有什么作用?

multithreading - 如何将向量发送到 Rust 中的衍生线程

rust - 如何告诉 Rust 编译器借用已经结束?

c# - 获取数组中第一个条目的指针

ios - 将 UnsafeMutablePointer 转换为 UnsafeMutableRawPointer