Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Module 将模块作为参数传递的正确方法是什么?_Module_Rust_Arguments - Fatal编程技术网

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

Module 将模块作为参数传递的正确方法是什么?,module,rust,arguments,Module,Rust,Arguments,我有一个模块文件(src/map/map.rs): 以及map模块文件(src/map/mod.rs): 导入main.rs,如下所示: mod map; use map::*; use map::gen; let (map, (player_x, player_y)) = Map::new(MAP_WIDTH, MAP_HEIGHT).generate_with(gen::dungeon::basic); 我希望能够像这样使用它: mod map; use map::*; use ma

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

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

导入main.rs,如下所示:

mod map;

use map::*;
use map::gen;
let (map, (player_x, player_y)) = Map::new(MAP_WIDTH, MAP_HEIGHT).generate_with(gen::dungeon::basic);
我希望能够像这样使用它:

mod map;

use map::*;
use map::gen;
let (map, (player_x, player_y)) = Map::new(MAP_WIDTH, MAP_HEIGHT).generate_with(gen::dungeon::basic);
我得到的错误是:

[cargo]预期值,找到模块'gen::dungeon::basic':不是值[E]

一个完整的。

如评论中所述,模块不是这样一个具体的概念;你试图做的是不可能的

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

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);
}
您还可以引入trait并将实现类型作为泛型传递:

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>();
}
trait地下城生成器{
fn generate()->u8;
}
mod basic{
使用地下城生成器;
pub-struct-Basic;
基础的impl地下城生成器{
fn generate()->u8{
0
}
}
}
国防部高级{
使用地下城生成器;
pub-struct-Advanced;
先进的impl地下城生成器{
fn generate()->u8{
42
}
}
}
fn玩游戏()
哪里
G:地下城生成器,
{
让dungeon=G::generate();
println!(“{}”,地牢);
}
fn main(){
玩游戏::();
玩游戏::();
}

如评论中所述,模块不是这样的具体概念;你试图做的是不可能的

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

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);
}
您还可以引入trait并将实现类型作为泛型传递:

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>();
}
trait地下城生成器{
fn generate()->u8;
}
mod basic{
使用地下城生成器;
pub-struct-Basic;
基础的impl地下城生成器{
fn generate()->u8{
0
}
}
}
国防部高级{
使用地下城生成器;
pub-struct-Advanced;
先进的impl地下城生成器{
fn generate()->u8{
42
}
}
}
fn玩游戏()
哪里
G:地下城生成器,
{
让dungeon=G::generate();
println!(“{}”,地牢);
}
fn main(){
玩游戏::();
玩游戏::();
}

模块不是值,而是函数。您应该将函数作为参数。模块不是值,而是函数。你应该把函数作为参数。我决定使用第二个,因为我觉得它更适合API。我决定使用第二个,因为我觉得它更适合API。