源特征无法访问

时间:2015-05-13 20:40:50

标签: rust visibility traits

情况(严重简化)(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());
                               ^~~~~~~~~~~~~~~~~~~~~~~~~

我的问题是,我甚至不知道这应该是什么意思。

1 个答案:

答案 0 :(得分:1)

它需要一个酒吧声明。你的声明也到处都是。推荐表单首先是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文件可见。