我正在尝试创建类似于下面代码的东西。如果我只是临时修改不可变的结构体(我撤销我所做的更改),那么将原始指针转换为原始指针是否安全?
#[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?类似,但不完全相同,因为它们永久更改不可变结构,而我在进行更改后立即撤消更改。
1条答案
按热度按时间v7pvogib1#
下面是一个使用
Cell
的简单示例:字符串