rust 临时改变不可变结构

vfh0ocws  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(161)

我正在尝试创建类似于下面代码的东西。如果我只是临时修改不可变的结构体(我撤销我所做的更改),那么将原始指针转换为原始指针是否安全?

#[derive(Debug)]
struct Num(i32); // doesn't impl Copy

// prints one more than the input num
fn modify_read_undo(num: &Num) {
    let num_ptr = num as *const Num as *mut Num; // the scary part
    unsafe {
        (*num_ptr).0 += 1;
        println!("{:?}", *num_ptr);
        (*num_ptr).0 -= 1;
    }
}

fn main() {
    let num = Num(0);
    modify_read_undo(&num); // prints "Num(1)" as hoped for
}

字符串
在这个小例子中,一切似乎都在正常工作,但我担心这是某种未定义的行为,只是碰巧现在正在工作。如果它只接受不可变的引用,这种函数可能吗?如果不可能,如何实现类似的模式(修改,读取,撤消)?
我知道如果我使用一个可变的引用或者只是获取所有权,这是可行的-我特别感兴趣的是使用一个不可变的引用(以满足trait边界)。如果有必要,我可以发布我的完整代码,但是这个例子很好地展示了我想要的东西。
注意事项:Is there a way to make an immutable reference mutable?类似,但不完全相同,因为它们永久更改不可变结构,而我在进行更改后立即撤消更改。

v7pvogib

v7pvogib1#

下面是一个使用Cell的简单示例:

use std::cell::Cell;

#[derive(Debug)]
struct Num(Cell<i32>); // Use Cell for interior mutability

fn modify_read_undo(num: &Num) {
    // Update the value directly with no need for borrowing
    num.0.set(num.0.get() + 1);
    println!("{:?}", num);
    // Undo the change
    num.0.set(num.0.get() - 1);
}

fn main() {
    let num = Num(Cell::new(0));
    modify_read_undo(&num);
    println!("{:?}", num); // prints "Num(Cell { value: 0 })"
}

字符串

相关问题