我正在学习Rust,如果这是一个琐碎的问题,请原谅。我已经谷歌了一个小时也没有结果。
我有一个数组的枚举值。我希望在该数组中找到与特定模式匹配的随机位置,并返回对其的可变引用,以便修改该位置的元素。
enum Tile {
Empty,
... // Other enum values
}
fn random_empty_tile(arr: &mut [Tile]) -> &mut Tile {
loop {
let i = rand::thread_rng().gen_range(0, arr.len());
let tile = &mut arr[i];
if let Tile::Empty = tile {
return tile;
}
}
}
借用检查器在这里有两个具体的问题。第一个是 arr.len()
的调用。这是不允许的,因为它需要对 arr
取一个不可变引用,而我们已经通过参数拥有了一个可变引用到 arr
。因此,不能取得其他引用,所以该调用是不允许的。
第二个问题是 return tile
。这会失败,因为借用检查器无法证明此引用的生命周期与 arr
本身的生命周期相同,因此返回它是不安全的。
我认为上述错误描述是正确的;我认为我理解了出了什么问题。不幸的是,我不知道如何解决这些问题中的任何一个。如果有人能够提供一种惯用的解决方案来实现这种行为,那将非常感激。
最终,我希望做到以下几点:
let mut arr = [whatever];
let empty_element = random_empty_tile(&mut arr);
*empty_element = Tile::SomeOtherValue;
因此,通过变异数组以替换空值。
let tile = &mut arr[i];
作为中间变量,为什么借用检查器会在这里失败似乎有点奇怪。这是编译器的缺陷吗? - Psidom