Module Can';t使用;超级";指由“引用”引入的名称;使用「;从另一个板条箱

Module Can';t使用;超级";指由“引用”引入的名称;使用「;从另一个板条箱,module,namespaces,rust,super,Module,Namespaces,Rust,Super,我在模块中使用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!"

我在模块中使用
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
\u hello

进一步澄清我的问题:函数
local\u hello()
在板条箱名称空间中声明为private。函数
lib_hello()
use
一起引入,并且在板条箱名称空间中成为私有名称。此时,名称
local_hello
lib_hello
具有相同的地位:它们都位于板条箱名称空间中,并且都是私有的。在
mymod
中,我使用
super
引用板条箱名称空间,可以访问
local\u hello
,但不能访问
lib\u hello
。有什么好处


我知道Python和C++命名空间。也许我需要忘却一些关键的东西?

使用
语句只导入本地范围。如果要重新导出,请使用
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
将使该项看起来好像存在于重新导出的模块中。

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
将使项目看起来像是存在于重新导出的模块中。

抱歉,我不是说将
local_hello()
标记为
pub
,也不是说将其导出到此板条箱之外(暂时假设这是一个lib板条箱)。类似地,我想使用
lib_hello()
,但不想从这个板条箱中重新导出它,我认为
pub use
就是这样做的。这是否改变了答案?相关的铁锈书链接:@goertzenator,是的,它确实改变了答案,因为它不可能
使用
不是从父模块或同级模块导出的,也不是在父模块或同级模块本身中定义的东西。谢谢,但我觉得。。。不满意。这些文件让我相信一个名字只能是公共的或私人的,但从我在这里看到的第三种模式是“私人的,有额外的限制”。Rust这样工作有充分的理由吗?或者这是一个可能被忽略/推迟的用例?@goertzenator您误解了“private”的含义,名称是模块的本地名称,不包括子模块。只有两种模式。我看不出有任何理由拥有这个功能<代码>使用
非常轻量级。由于模块通常分为文件,
use
能够追溯标识符而无需跳出文件非常重要。抱歉,我的意思不是将
local_hello()
标记为
pub
,也不是将其导出到此板条箱之外(暂时假设这是一个lib板条箱)。类似地,我想使用
lib_hello()
,但不想从这个板条箱中重新导出它,我认为
pub use
就是这样做的。这是否改变了答案?相关的铁锈书链接:@goertzenator,是的,它确实改变了答案,因为它不可能
使用
不是从父模块或同级模块导出的,也不是在父模块或同级模块本身中定义的东西。谢谢,但我觉得。。。不满意。这些文件让我相信一个名字只能是公共的或私人的,但从我在这里看到的第三种模式是“私人的,有额外的限制”。Rust这样工作有充分的理由吗?或者这是一个可能被忽略/推迟的用例?@goertzenator您误解了“private”的含义,名称是模块的本地名称,不包括子模块。只有两种模式。我看不出有任何理由拥有这个功能<代码>使用
非常轻量级。由于模块通常被拆分为文件,
使用
对于能够追溯标识符而无需跳出文件非常重要。