rust - 借用“self”问题

标签 rust

我尝试使示例代码尽可能简单

struct Level;

pub struct GameManager<'self>{
    lvl: Level,
    actors: ~[Actor<'self>]
}
struct Actor<'self>{
    lvl: &'self Level
}
impl<'self> GameManager <'self> {
    pub fn new() -> GameManager{
        GameManager {lvl: Level,actors: ~[]}
    }
    fn spawn_actor<'r>(&'r self) -> Actor<'r>{
        Actor{lvl: &'r self.lvl}
    }
}
fn main() {
    let mut gm = GameManager::new();

    let mut actor1 = gm.spawn_actor();

    gm.actors.push(actor1);


}

错误:

/home/maik/source/test.rs:23:4: 23:13 error: cannot borrow `gm.actors` as mutable because it is also borrowed as immutable
/home/maik/source/test.rs:23     gm.actors.push(actor1);
                                 ^~~~~~~~~
/home/maik/source/test.rs:21:21: 21:23 note: second borrow of `gm.actors` occurs here
/home/maik/source/test.rs:21     let mut actor1 = gm.spawn_actor();

如您所见,我希望 GameManager 生成一个 actor。一个 GameManager 作为一个关卡,我希望所有生成的 actor 都能引用 GameManager 的关卡。

有人可以向我解释这个错误吗?我该如何修复它?

最佳答案

这在 Rust 中似乎是不可能的。

但是我找到了一个解决方案来做到这一点,我只需要封装更多一点,比如

struct Level;
pub struct ActorController{
    lvl: Level
}
pub struct GameManager<'self>{
    actors: ~[Actor<'self>],
    actor_controller: ActorController
}
struct Actor<'self>{
    lvl: &'self Level
}
impl ActorController {
    fn spawn_actor<'r>(&'r self) -> Actor<'r>{
        Actor{lvl: &'r self.lvl}
    }
}
impl<'self> GameManager <'self> {
    pub fn new() -> GameManager{
        GameManager {actors: ~[], actor_controller: ActorController{lvl: Level}}
    }
}
fn main() {
    let mut gm = GameManager::new();

    let actor1 = gm.actor_controller.spawn_actor();

    gm.actors.push(actor1);


}

关于rust - 借用“self”问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18140088/

相关文章:

rust - 如何正确实现Deref + DerefMut?

io - 使用 Read::read_to_string 从 TcpStream 读取会挂起,直到连接被远程端关闭

rust - 我的最小函数有什么问题?

types - 我什么时候应该在普通元组上使用元组结构?

rust - 无法编译使用 std::io 的代码 - `File` 中没有 `std::io`

if-statement - 为什么我们不在if/else的末尾加一个分号(;)呢?

pointers - 带有原始指针的静态结构给出 "` core::marker::Sync` 未实现...”

rust - 不能用箱子写 key 文件

rust - 如何在 Rust 的内部特征上实现外部特征?

rust - 实现并使用另一个特征的特征