情况(严重简化)(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());
^~~~~~~~~~~~~~~~~~~~~~~~~
我的问题是,我甚至不知道这应该是什么意思。
答案 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文件可见。