源特征不可访问

Source trait is inaccessible

情况是(严重简化)这个(playpen):

mod tokentree {
    pub struct TokenTree;
    mod serialize {
        use std::collections::BTreeMap;
        use super::TokenTree;
        #[derive(Debug)]
        pub struct InternStr;
        pub trait InternStrsExt {
            fn intern_strs(&self) -> BTreeMap<&str, InternStr>;
        }
        impl InternStrsExt for [TokenTree] {
            fn intern_strs(&self) -> BTreeMap<&str, InternStr> { BTreeMap::new() }
        }
    }
    pub use self::serialize::{InternStrsExt, InternStr};
}
use tokentree::*;

fn main() {
    println!("{:?}", [TokenTree].intern_strs());
}

我收到以下错误(夜间和测试版):

<anon>:20:22: 20:47 error: source trait is inaccessible
<anon>:20     println!("{:?}", [TokenTree].intern_strs());
                               ^~~~~~~~~~~~~~~~~~~~~~~~~

我的问题是我什至不知道这是什么意思。

它需要一个发布声明。你的声明也到处都是。推荐的形式是先粘贴 pub mod 声明,然后再粘贴 use

这是工作示例。

mod tokentree {
    pub struct TokenTree;
    pub mod serialize {
        use std::collections::BTreeMap;
        use super::TokenTree;
        #[derive(Debug)]
        pub struct InternStr;
        pub trait InternStrsExt {
            fn intern_strs(&self) -> BTreeMap<&str, InternStr>;
        }
        impl InternStrsExt for [TokenTree] {
            fn intern_strs(&self) -> BTreeMap<&str, InternStr> { BTreeMap::new() }
        }
    }
    pub use self::serialize::{InternStrsExt, InternStr};
}
pub use tokentree::*;

fn main() {
    println!("{:?}", [TokenTree].intern_strs());
}

(playpen)

这里发生的事情是您偶然发现了以下故障:

您不能从私有模块中导出您的特征。这就是为什么您需要将 mod serialize 更改为 pub mod serialize。例如,此 playpen example 表明导出 struct Export 有效,但取消注释 println! 将使其停止编译,因为我们使用了一个特征。

提示:帮助我了解可见性规则的一件事是生成 doc 文件并查看哪些 doc 文件可见。