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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Rust无法将Singleton从全局空间导入另一个文件中的另一个模块相关的知识,希望对你有一定的参考价值。

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

给定如下的主文件,test_stuff可以访问gamedata:

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单例,是否可以在另一个模块中访问?

为了确保我提供了一个Minimal,Complete和Verifiable示例,这是我在GitHub上的完整示例代码:https://github.com/camccar/moduleError

答案

::GAMEDATA指的是在GAMEDATA板条箱的根箱中称为gamedata的一些值。但是,你定义的GAMEDATA不在那个箱子里,它在你的main.rs文件中有gamedata作为依赖。

所以你在这里尝试做的就是从箱子里拿出一些东西来取决于你,我不确定,但我不认为这是允许的。

你可以考虑反转这个,而不是在你的gamedata箱子里初始化GAMEDATA,如果你需要在main中使用它你可以正常use

extern crate gamedata;

use gamedata::GAMEDATA;

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

    ...
}

或者,如果GAMEDATA不是您的游戏数据箱应该知道如何定义的东西,您可以在main中构建它并将其传递给gamedata crate中的某个函数作为参数。

以上是关于Rust无法将Singleton从全局空间导入另一个文件中的另一个模块的主要内容,如果未能解决你的问题,请参考以下文章

Rust从入门到精通10-所有权

Rust 有问有答之 use 关键字

Rust 有问有答之 use 关键字

wsdl.exe 错误:无法从命名空间“...”导入绑定“...”

如何将lodash直接导入JavaScript中的自定义命名空间

无法在 Rust/Actix 应用程序中使用带有柴油的计时功能