Rust не может импортировать синглтон из глобального пространства в другой модуль в другом файле - PullRequest
0 голосов
/ 02 сентября 2018

Использование библиотеки 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 голосов
/ 02 сентября 2018

::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 ящик в качестве параметра.

...