digoal
2022-04-18
PostgreSQL , PolarDB , rust , 公有 , 私有 , 可见性 , mod , database , schema , object
rust 模块私有公有 可见性概念 有点类似 PostgreSQL 逻辑架构授权机制
https://kaisery.github.io/trpl-zh-cn/ch07-03-paths-for-referring-to-an-item-in-the-module-tree.html
cargo new --lib a
cd a
vi src/lib.rs
以下报错是因为 hosting和add_to_waitlist没有pub, 外面看不到其定义.
mod front_of_house {
mod hosting {
pub fn add_to_waitlist() {}
}
}
pub fn eat_at_restaurant() {
// 绝对路径
crate::front_of_house::hosting::add_to_waitlist();
// 相对路径
front_of_house::hosting::add_to_waitlist();
}
以下报错是因为 add_to_waitlist没有pub, 外面看不到其定义.
mod front_of_house {
pub mod hosting {
fn add_to_waitlist() {}
}
}
pub fn eat_at_restaurant() {
// 绝对路径
crate::front_of_house::hosting::add_to_waitlist();
// 相对路径
front_of_house::hosting::add_to_waitlist();
}
正常, 为什么front_of_house不用pub , 在同一个crate内, 可以看到同级或外层mod的定义, 这里 eat_at_restaurant 和 front_of_house 同级.
mod front_of_house { // 为什么这不用pub , 在同一个crate内, 可以看到同级或外层mod的定义, eat_at_restaurant 和 front_of_house 同级.
pub mod hosting {
pub fn add_to_waitlist() {}
}
}
pub fn eat_at_restaurant() {
// 绝对路径
crate::front_of_house::hosting::add_to_waitlist();
// 相对路径
front_of_house::hosting::add_to_waitlist();
}
正常, front_of_house这不用pub, 在同一个crate内, 可以看到同级或外层mod的定义, backend和front_of_house同级, backend里面的fn可以看到front_of_house的定义.
mod front_of_house { // 为什么这不用pub , 在同一个crate内, 可以看到同级或外层mod的定义, eat_at_restaurant 和 front_of_house 同级.
pub mod hosting {
pub fn add_to_waitlist() {}
}
}
mod backend {
pub fn eat_at_restaurant() {
// 绝对路径
crate::front_of_house::hosting::add_to_waitlist();
// 相对路径
super::front_of_house::hosting::add_to_waitlist();
}
}
rust mod的私有共有权限, 有点像PostgreSQL的权限授予层次. PostgreSQL的逻辑架构如下:
- database - schema - object
每一层有每一层的权限判定:
- 只授予database, 并不能访问database里的schema和object
- 只授予database和schema, 也不能访问该schema下的object
- 只授予object, 也不能通过未授权的database,schema来访问该object
rust也一样,
- 如果mod不可见, 即使mod里面的pub object也不可见.
- 仅仅pub mod, pub mod里面的 object不可见.
- 必须全链路可见才可以被引用.
什么时候不需要加pub就可以引用?
- 同级, 例如
a、 b/c/d
.b,c,d
都能直接引用a
不需要pub a
. - 或者路径深层看路径外面, 例如
a/b/c/d
d
引用abc
不需要pub a, pub b, pub c
,c
引用ab
不需要pub a, pub b
,b
引用a
不需要pub a
.