gpt4 book ai didi

rust - 初始化结构的可变引用数组

转载 作者:行者123 更新时间:2023-11-29 08:18:13 25 4
gpt4 key购买 nike

我有 struct Board,其中包含一个元素 rows: [[&'a mut Tile; 7];7]

由于生命周期的原因,我不知道如何通过 impl Board{} block 中的构造函数对其进行初始化,因此我尝试在 main 函数中对其进行初始化.

可悲的是,rows = [[&mut Tile::def(); 7]; 7] 不起作用,因为 Rust 想要复制引用 &mut Tile::def()。 (其中 Tile::def()Tile 的构造函数)。

有没有办法初始化这个数组,使每个元素 (i,j) 都是对不同 Tile 的引用?

目前,唯一可行的解​​决方案是

let mut rows = [[&mut Tile::def(), &mut Tile::def(), &mut Tile::def(), &mut Tile::def(), &mut Tile::def(), &mut Tile::def(), &mut Tile::def()],[&mut Tile::def(), &mut Tile::def(), &mut Tile::def(), &mut Tile::def(), &mut Tile::def(), &mut Tile::def(), &mut Tile::def()],[&mut Tile::def(), &mut Tile::def(), &mut Tile::def(), &mut Tile::def(), &mut Tile::def(), &mut Tile::def(), &mut Tile::def()],[&mut Tile::def(), &mut Tile::def(), &mut Tile::def(), &mut Tile::def(), &mut Tile::def(), &mut Tile::def(), &mut Tile::def()],[&mut Tile::def(), &mut Tile::def(), &mut Tile::def(), &mut Tile::def(), &mut Tile::def(), &mut Tile::def(), &mut Tile::def()],[&mut Tile::def(), &mut Tile::def(), &mut Tile::def(), &mut Tile::def(), &mut Tile::def(), &mut Tile::def(), &mut Tile::def()],[&mut Tile::def(), &mut Tile::def(), &mut Tile::def(), &mut Tile::def(), &mut Tile::def(), &mut Tile::def(), &mut Tile::def()]];

let board = Board { rows : rows, ...};

由于显而易见的原因,这并不令人满意。

我尝试的是创建一个函数来转换 [[Tile; 7]; 7] 放入所需的数组中,但我遇到了无法多次借用该数组的可变元素的问题。

最佳答案

&mut不仅仅是“带有突变的指针”。这是一个。这意味着它不能拥有 Tile ,它必须属于其他地方。

这种方法

let mut rows = [[&mut Tile::def(), &mut Tile::def(), &mut Tile::def(), &mut Tile::def(), &mut Tile::def(), &mut Tile::def(), &mut Tile::def()],[&mut Tile::def(), &mut Tile::def(), &mut Tile::def(), &mut Tile::def(), &mut Tile::def(), &mut Tile::def(), &mut Tile::def()],[&mut Tile::def(), &mut Tile::def(), &mut Tile::def(), &mut Tile::def(), &mut Tile::def(), &mut Tile::def(), &mut Tile::def()],[&mut Tile::def(), &mut Tile::def(), &mut Tile::def(), &mut Tile::def(), &mut Tile::def(), &mut Tile::def(), &mut Tile::def()],[&mut Tile::def(), &mut Tile::def(), &mut Tile::def(), &mut Tile::def(), &mut Tile::def(), &mut Tile::def(), &mut Tile::def()],[&mut Tile::def(), &mut Tile::def(), &mut Tile::def(), &mut Tile::def(), &mut Tile::def(), &mut Tile::def(), &mut Tile::def()],[&mut Tile::def(), &mut Tile::def(), &mut Tile::def(), &mut Tile::def(), &mut Tile::def(), &mut Tile::def(), &mut Tile::def()]];

之所以有效,是因为每个人 Tile::def()创建一个新的临时 Tile , 和 &mut导致临时文件被“提升”到堆栈——参见 Why is it legal to borrow a temporary?了解更多信息。但这不是解决此问题的方法:您需要一些东西来拥有 Tile

例如,您可以创建一个 Vec<Tile>并填写 rows引用 Vec 的成员.但这并不能解决你的初始化问题,真正的答案更简单:你想要一个拥有的指针,所以使用Box<Tile>而不是 &mut Tile .

Box没有实现 Copy ,但它确实实现了另一个使这项工作更容易的特性:Default .

impl Default for Tile {
fn default() -> Self {
Tile::def()
}
}

fn main() {
let mut rows: [[Box<Tile>; 7]; 7] = Default::default();
}

取决于什么Tile::def是的,你也可以#[derive(Default)]而不是手动实现。


我鼓励您考虑另一种选择:存储所有 Tile s 在 Vec ,但通过索引而不是任何类型的指针来引用它们。交换两个指数很便宜,很容易增长 Vec如果需要,它可以存储 rows除了没有生命周期问题的后备存储外,它比存储所有 Tile 更适合缓存(这可能意味着更好的性能) s 在单独的分配中。但它不一定在所有情况下都是理想的。

关于rust - 初始化结构的可变引用数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53788733/

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