在Rust

时间:2018-03-17 18:46:53

标签: rust

我是Rust的新手,我正在使用Piston引擎进行游戏以润湿我的脚。

我想使用精灵表格渲染一堆实体,但很多实体可能会共享精灵表格,所以我只想加载并存储每个文件的一个副本。

在伪代码中,我的方法基本上是这样的:

fn get_spritesheet(hashmap_cache, file):
    if file not in hashmap_cache:
        hashmap_cache[file] = load_image_file(file)

    return hashmap_cache[file]

然后可能是这样的:

//These 'sprite' fileds point to the same image in memory
let player1 = Entity { sprite: get_spritesheet(cache, "player.png") };
let player2 = Entity { sprite: get_spritesheet(cache, "player.png") }; 

但是,我正在使用Rust的所有权系统遇到很多障碍(可能是因为我不理解它)。

据我所知,我希望cahe / hashmap能够拥有"拥有"图像资源。具体来说,返回引用(如在get_spritesheet函数中)似乎很奇怪。此外,结构是否可能不拥有其所有成员?我想是的,但我对如何做到这一点很困惑。

2 个答案:

答案 0 :(得分:6)

这是std::collections::hash_map::Entry的用途:

  

地图中单个条目的视图,可能是空置或占用。

match hashmap_cache.entry(key) {
    Entry::Vacant(entry) => *entry.insert(value),
    Entry::Occupied(entry) => *entry.get(),
}

如果条目为空,则将值插入缓存中,否则从缓存中接收值。

Playground

答案 1 :(得分:0)

我发现返还借用只是给了我一个错误,因为我传入了两个借用的函数引用,并且它不知道返回的是哪一个借来的。添加生命周期参数使其工作。我的功能现在看起来像这样:

pub fn load_spritesheet<'a>(
    spritesheets: &'a mut HashMap<String, Texture>,
    file: &String,
) -> Option<&'a Texture> {
    if !spritesheets.contains_key(file) {
        if let Some(texture) = load_texture(
            &vec!["dynamic_entities", "spritesheets"],
            file.as_str(),
            &TextureSettings::new(),
        ) {
            spritesheets.insert(file.clone(), texture);
        }
    }
    spritesheets.get(file)
}

至于struct中的引用,我刚刚实现了一个每帧调用load_spritesheet的getter方法。不理想,但现在有效。