gpt4 book ai didi

rust - 有没有一种安全的方法可以从 Rust 中的可变引用中临时检索拥有的值?

转载 作者:行者123 更新时间:2023-12-03 11:33:21 28 4
gpt4 key购买 nike

<分区>

我正在使用两个独立的函数。

  • 第一个接受一个结构的拥有实例然后返回它。
  • 第二个采用可变引用但需要使用第一个函数。
// This structure is not `Clone`.
struct MyStruct;

fn take_owned(s: MyStruct) -> MyStruct {
// Do things
s
}

fn take_mut(s: &mut MyStruct) {
*s = take_owned(s /* problem */);
}

我想过一个解决方案,但我不确定它是否合理:

use std::ptr;

// Temporarily turns a mutable reference into an owned value.
fn mut_to_owned<F>(val: &mut MyStruct, f: F)
where
F: FnOnce(MyStruct) -> MyStruct,
{
// We're the only one able to access the data referenced by `val`.
// This operation simply takes ownership of the value.
let owned = unsafe { ptr::read(val) };

// Do things to the owned value.
let result = f(owned);

// Give the ownership of the value back to its original owner.
// From its point of view, nothing happened to the value because we have
// an exclusive reference.
unsafe { ptr::write(val, result) };
}

使用这个函数,我可以做到:

fn take_mut(s: &mut MyStruct) {
mut_to_owned(s, take_owned);
}

这段代码合理吗?如果没有,是否有安全的方法?

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com