2015-05-25 4 views
1

Я использую super внутри модуля, чтобы ссылаться на имена в родительском пространстве имен. Однако я не могу заставить это работать, когда я ссылаюсь на имя в родительском пространстве имен, которое было внесено с помощью инструкции use. Что я делаю не так?Невозможно использовать «супер», чтобы ссылаться на имя, которое было внесено «использованием» из другого ящика.

// crate mylib 

pub fn lib_hello() {println!("Hello from mylib!");} 


// crate mybin 

extern crate mylib; 
use mylib::lib_hello; 

fn local_hello() {println!("Hello from here!");} 

mod mymod { 
    fn f() { super::local_hello() } // Ok 
    fn g() { super::lib_hello() } // error: unresolved name `super::lib_hello` 
} 

fn main() { 
    lib_hello(); // Ok 
} 

редактировать: удалить pub из local_hello

дополнительных разъяснений относительно того, что я прошу: Функция local_hello() объявлена ​​как частное в пространстве имен клети. Функция lib_hello() вводится с use, а также становится частным именем в пространстве имен ящиков. На данный момент имена local_hello и lib_hello имеют одинаковый рост: они оба находятся в пространстве имен ящиков, и оба являются частными. В mymod Я использую super для ссылки на пространство имен ящиков и вы можете получить доступ к local_hello, но не lib_hello. Что дает?

Я знаю о пространствах имен Python и C++. Возможно, есть какой-то важный бит, который мне нужно отучить?

ответ

4

use Операции только для импорта в локальную область. Если вы хотите реэкспорт, используйте pub use

// crate mylib 

pub fn lib_hello() {println!("Hello from mylib!");} 


// crate mybin 

extern crate mylib; 
pub use mylib::lib_hello; 

pub fn local_hello() {println!("Hello from here!");} 

mod mymod { 
    fn f() { super::local_hello() } // Ok 
    fn g() { super::lib_hello() } // error: unresolved name `super::lib_hello` 
} 

fn main() { 
    lib_hello(); // Ok 
} 

pub use сделает деталь кажется, что она существует в модуле быть реэкспорта из.

+0

Извинения, я не имел в виду 'local_hello()', которые должны быть помечены как 'pub', и я не хочу, чтобы он был экспортирован за пределы этого ящика (притворяйтесь, что это ящик lib на мгновение). Точно так же я хочу использовать 'lib_hello()', но не хочу реэкспортировать его из этого ящика, что я думаю, что 'pub use' делает. Изменит ли это ответ? – goertzenator

+0

Ссылка на ссылку Rust: https://doc.rust-lang.org/book/crates-and-modules.html#re-exporting-with-pub-use – mdup

+0

@goertzenator, да, это меняет ответ в что невозможно «использовать» то, что не экспортируется из родительского или дочернего модуля и которое не определено в самом родительском или родном модуле. –

 Смежные вопросы

  • Нет связанных вопросов^_^