Rust无法将Singleton从全局空间导入另一个文件中的另一个模块

时间:2018-09-02 03:45:08

标签: module rust singleton

使用lazy_static库创建一个单例。我无法在另一个文件的模块中访问该单例。如果模块在主要功能下定义,则可以正常访问。

给出如下主文件,test_stuff可以很好地访问游戏数据:

extern crate gamedata;
#[macro_use]
extern crate lazy_static;


lazy_static! {
    pub static ref GAMEDATA: &'static str = "I am a test STrings";
} 

fn main() {
    println!("Game Data:{}",*GAMEDATA);
    let obj = gamedata::readinginstatic::readinginstatic {
        structure:"working".to_string()
    };
    obj.print_static();
}

mod test_stuff {
    use ::GAMEDATA;
    fn printthing() {
        println!("herenow:{}", *GAMEDATA);
    }
}

带有lib.rs文件,例如:

pub mod readinginstatic;

以及另一个文件readinginstatic.rs中的模块,如下所述:

use ::GAMEDATA;

pub struct readinginstatic {
    pub structure:String,
}

impl readinginstatic {
    pub fn print_static(&self) {
        println!("In Print static width:{}", *::GAMEDATA);
    }
}

我得到了错误:

  

在板条箱根中找不到

尝试导入GAMEDATA时。

如果在另一个文件中定义了lazy_static单例,是否可以访问另一个模块?

为确保提供一个最小,完整和可验证的示例,这里是我在GitHub上的整个示例代码:https://github.com/camccar/moduleError

1 个答案:

答案 0 :(得分:2)

::GAMEDATA指的是GAMEDATA板条箱的板条根中的一个名为gamedata的值。但是,您定义GAMEDATA的位置不在该板条箱中,而是在您的main.rs文件中,其中有gamedata作为依赖项。

因此,您要在此处进行的操作是从板条箱中伸出援手,请使用取决于您的板条箱中的某些物品,我不确定,但我认为这是不允许的。

您可以考虑将其反转,而不是在gamedata板条箱中初始化GAMEDATA,并且如果您需要在主机中使用它,可以正常地use进行

extern crate gamedata;

use gamedata::GAMEDATA;

fn main(){
    println!("Game Data:{}", *GAMEDATA);

    ...
}

如果GAMEDATA不是您的游戏数据箱应该知道的定义,则可以在main内部构造它,并将其作为参数传递给gamedata箱中的某个函数。