首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >传递模块作为参数的正确方法是什么?

传递模块作为参数的正确方法是什么?
EN

Stack Overflow用户
提问于 2018-03-14 19:54:18
回答 1查看 1.3K关注 0票数 2

我有一个模块文件(src/map/map.rs):

代码语言:javascript
代码运行次数:0
运行
复制
type Layer = Vec<Vec<Tile>>;

pub struct Map {
    height: i32,
    width: i32,
    data: Layer,
    rooms: Vec<Rect>,
}

impl Map {
    pub fn new(width: i32, height: i32) -> Self {
        Map {
            height: height,
            width: width,
            data: vec![vec![Tile::wall(); height as usize]; width as usize],
            rooms: vec![Rect],
        }
    }
    pub fn generate_with(&self, creator: module) {
        creator::generate(&self)
    }
}

具有文件中一个函数的嵌套模块map::gen::dungeon::basic (src/map/gen/dungeon/basic.rs):

代码语言:javascript
代码运行次数:0
运行
复制
pub fn generate(map: &mut Map) -> (Map, (i32, i32)) {}

map模块文件(src/map/mod.rs):

代码语言:javascript
代码运行次数:0
运行
复制
mod rect;
mod tile;
mod map;
pub mod room;
pub mod gen;

pub use self::map::Map;
pub use self::rect::Rect;
pub use self::tile::Tile;

像这样导入到main.rs中:

代码语言:javascript
代码运行次数:0
运行
复制
mod map;

use map::*;
use map::gen;

我想像这样使用它:

代码语言:javascript
代码运行次数:0
运行
复制
let (map, (player_x, player_y)) = Map::new(MAP_WIDTH, MAP_HEIGHT).generate_with(gen::dungeon::basic);

不过,我得到的错误是:

代码语言:javascript
代码运行次数:0
运行
复制
[cargo] expected value, found module 'gen::dungeon::basic': not a value [E]

一个完整的有回购服务

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-14 21:02:34

正如注释中所述,模块不是这样的具体概念;您试图做的事情是不可能的。

相反,您可以传递可以是值的内容:

代码语言:javascript
代码运行次数:0
运行
复制
mod basic {
    pub fn generate() -> u8 {
        0
    }
}

mod advanced {
    pub fn generate() -> u8 {
        42
    }
}

fn play_the_game(generator: fn() -> u8) {
    let dungeon = generator();
    println!("{}", dungeon);
}

fn main() {
    play_the_game(basic::generate);
    play_the_game(advanced::generate);
}

您还可以引入一个特性并将实现类型传递为泛型:

代码语言:javascript
代码运行次数:0
运行
复制
trait DungeonGenerator {
    fn generate() -> u8;
}

mod basic {
    use DungeonGenerator;

    pub struct Basic;

    impl DungeonGenerator for Basic {
        fn generate() -> u8 {
            0
        }
    }
}

mod advanced {
    use DungeonGenerator;

    pub struct Advanced;

    impl DungeonGenerator for Advanced {
        fn generate() -> u8 {
            42
        }
    }
}

fn play_the_game<G>()
where
    G: DungeonGenerator,
{
    let dungeon = G::generate();
    println!("{}", dungeon);
}

fn main() {
    play_the_game::<basic::Basic>();
    play_the_game::<advanced::Advanced>();
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49286608

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档