Skip to content

Latest commit

 

History

History
143 lines (95 loc) · 4.78 KB

20230418_02.md

File metadata and controls

143 lines (95 loc) · 4.78 KB

rust 模块私有公有 可见性概念 有点类似 PostgreSQL 逻辑架构授权机制

作者

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.

digoal's wechat