basic/crate-module/use #646
Replies: 27 comments 23 replies
-
这里内容不够全。建议介绍不同目录的代码文件的引用,即代码文件分布在不同目录时,怎样使用。 |
Beta Was this translation helpful? Give feedback.
-
怎么在我的项目里用这个restaurant呢.. |
Beta Was this translation helpful? Give feedback.
-
不知道后边有没有分享真实项目package, crate, module的使用的,因为这里不仅是规则上的问题,更多的是一种最佳实践。 |
Beta Was this translation helpful? Give feedback.
-
讲得非常清楚,看懂了,太棒了 |
Beta Was this translation helpful? Give feedback.
-
还是要用起来才知道 |
Beta Was this translation helpful? Give feedback.
-
这个文件夹的问题还是要实践 |
Beta Was this translation helpful? Give feedback.
-
引入项再导出---的pub use没看懂,在另一个文件中引入mod之后pub use照样不能访问其中的非pub模块都嘛?请高手赐教 |
Beta Was this translation helpful? Give feedback.
-
|
Beta Was this translation helpful? Give feedback.
-
我没看明白受限的可见性那块的描述。代码上给点注释啊。 |
Beta Was this translation helpful? Give feedback.
-
// lib.rs
pub mod a {
}
// main.rs
//
use test::a;
fn main() {}
[package]
name = "test"
version = "0.1.0"
edition = "2021" 这样写可以通过cargo编译,但是VS Code报错提示:
我有些疑惑默认lib.rs和main.rs中模块的关系 |
Beta Was this translation helpful? Give feedback.
-
https://www.cnblogs.com/fire-cat/p/17578600.html |
Beta Was this translation helpful? Give feedback.
-
总结:
|
Beta Was this translation helpful? Give feedback.
-
|
Beta Was this translation helpful? Give feedback.
-
2.12 竟然是我看的最懵逼的一章,莫非是我心态轻浮了。。。 |
Beta Was this translation helpful? Give feedback.
-
受限的可见性这里举的例子不太合适 // 目标:`a` 导出 `I`、`bar` and `foo`,其他的不导出
pub mod a {
pub const I: i32 = 3;
fn semisecret(x: i32) -> i32 {
use self::b::c::J;
x + J
}
pub fn bar(z: i32) -> i32 {
semisecret(I) * z
}
pub fn foo(y: i32) -> i32 {
semisecret(I) + y
}
mod b {
mod c {
const J: i32 = 4;
}
}
} 这里本身函数 // 目标:`a` 导出 `I`、`bar` and `foo`,其他的不导出
pub mod a {
pub const I: i32 = 3;
fn semisecret(x: i32) -> i32 {
use self::b::c::J;
x + J
}
pub fn bar(z: i32) -> i32 {
semisecret(I) * z
}
pub fn foo(y: i32) -> i32 {
semisecret(I) + y
}
mod b {
pub mod c {
pub const J: i32 = 4;
}
}
} |
Beta Was this translation helpful? Give feedback.
-
怎么用lib.rs查找包啊,没看懂 |
Beta Was this translation helpful? Give feedback.
-
模块mod这块不太复杂,但可见性这块挺复杂的,结合实战继续学习吧! |
Beta Was this translation helpful? Give feedback.
-
二刷,觉得更加牛逼了 |
Beta Was this translation helpful? Give feedback.
-
感觉限制可见性的例子不够典型。 |
Beta Was this translation helpful? Give feedback.
-
给最后一个例子又加了一些使用情况,也算是一个笔记吧,供参考。有不对的地方也请大佬们指出,不要不小心误导了别人。 // 一个名为 `my_mod` 的模块
mod my_mod {
// 模块中的项默认具有私有的可见性
fn private_function() {
println!("called `my_mod::private_function()`");
}
// 使用 `pub` 修饰语来改变默认可见性。
pub fn function() {
println!("called `my_mod::function()`");
}
// 在同一模块中,项可以访问其它项,即使它是私有的。
pub fn indirect_access() {
print!("called `my_mod::indirect_access()`, that\n> ");
private_function();
}
// 模块也可以嵌套
pub mod nested {
pub fn function() {
println!("called `my_mod::nested::function()`");
}
#[allow(dead_code)]
fn private_function() {
println!("called `my_mod::nested::private_function()`");
}
// 使用 `pub(in path)` 语法定义的函数只在给定的路径中可见。
// `path` 必须是父模块(parent module)或祖先模块(ancestor module)
pub(in crate::my_mod) fn public_function_in_my_mod() {
print!("called `my_mod::nested::public_function_in_my_mod()`, that\n > ");
public_function_in_nested()
}
// 使用 `pub(self)` 语法定义的函数则只在当前模块中可见。
pub(self) fn public_function_in_nested() {
println!("called `my_mod::nested::public_function_in_nested");
}
// 使用 `pub(super)` 语法定义的函数只在父模块中可见。
pub(super) fn public_function_in_super_mod() {
println!("called my_mod::nested::public_function_in_super_mod");
}
}
pub fn call_public_function_in_my_mod() {
print!("called `my_mod::call_public_funcion_in_my_mod()`, that\n> ");
nested::public_function_in_my_mod();
print!("> ");
nested::public_function_in_super_mod();
}
// `pub(crate)` 使得函数只在当前包中可见
pub(crate) fn public_function_in_crate() {
println!("called `my_mod::public_function_in_crate()");
}
// 嵌套模块的可见性遵循相同的规则
mod private_nested {
#[allow(dead_code)]
pub fn function() {
println!("called `my_mod::private_nested::function()`");
}
// Arrow: 父模块中的项(即使私有)对子模块可见,所以可以直接调用
pub fn call_private_function_in_super() {
print!("called `my_mod::private_nested::call_private_function_in_super`, that\n > ");
super::private_function();
}
// Arrow: 私有模块内嵌套私有模块,目的是展示用“再导出”方法调用多层私有模块下的 `pub` 函数,和文章中“受限的可见性”章节的第一种方法一样
mod private_nested_nested {
pub fn call_private_function_in_super() {
print!("called `my_mod::private_nested::private_nested_nested::call_private_function_in_super`, that\n > ");
super::super::private_function();
}
}
// Arrow: 再导出函数,以便 `private_nested` 访问,改名的目的是避免 `private_nested` 下出现两个 `call_private_function_in_super` 函数
pub use self::private_nested_nested::call_private_function_in_super as c_p_f_i_s;
}
// Arrow: 没理解错的话,下面两行应该是等价的?不过现实中可能没有人会用第二行那种方法。这两行只能留一个,因为现在是同名的
pub use private_nested::call_private_function_in_super;
// pub fn call_private_function_in_super() { self::private_nested::call_private_function_in_super(); }
// Arrow: 再导出函数,以便 `my_mod` 访问
pub use private_nested::c_p_f_i_s;
// Arrow: 同级时,项访问其他私有模块中的 `pub` 项。最上面的 `indirect_access` 访问的是同级私有函数,我不确定模块是不是也行,所以试了这个
pub fn indirect_access_private_nested() {
print!("called `my_mod::indirect_access_private_nested`, that\n> ");
private_nested::call_private_function_in_super();
}
}
fn function() {
println!("called `function()`");
}
fn main() {
// 模块机制消除了相同名字的项之间的歧义。
function();
my_mod::function();
// 公有项,包括嵌套模块内的,都可以在父模块外部访问。
my_mod::indirect_access();
my_mod::nested::function();
my_mod::call_public_function_in_my_mod();
// pub(crate) 项可以在同一个 crate 中的任何地方访问
my_mod::public_function_in_crate();
// pub(in path) 项只能在指定的模块中访问
// 报错!函数 `public_function_in_my_mod` 是私有的
//my_mod::nested::public_function_in_my_mod();
// 试一试 ^ 取消该行的注释
// 模块的私有项不能直接访问,即便它是嵌套在公有模块内部的
// 报错!`private_function` 是私有的
//my_mod::private_function();
// 试一试 ^ 取消此行注释
// 报错!`private_function` 是私有的
//my_mod::nested::private_function();
// 试一试 ^ 取消此行的注释
// 报错! `private_nested` 是私有的
//my_mod::private_nested::function();
// 试一试 ^ 取消此行的注释
// Arrow
my_mod::indirect_access_private_nested();
// Arrow: 导出自 `my_mod::private_nested` 的 `call_private_function_in_super` 函数
my_mod::call_private_function_in_super();
// Arrow: 导出自 `my_mod::private_nested::private_nested_nested` 的 `call_private_function_in_super` 函数
my_mod::c_p_f_i_s();
// Arrow: 在这种情况下,这三条是等价的。前两条是永远等价的,第二条只是省略了 `self`。但是第三条,当模块不在根模块下时,也许会需要额外路径。
self::my_mod::function();
my_mod::function();
// Arrow: 下面是绝对路径,上面两个是相对路径。
crate::my_mod::function();
} |
Beta Was this translation helpful? Give feedback.
-
三兄弟更短了👍🤣 |
Beta Was this translation helpful? Give feedback.
-
但是对于 但这还需要这个 Trait 允许被 dyn ,而不至于需要 |
Beta Was this translation helpful? Give feedback.
-
basic/crate-module/use
https://course.rs/basic/crate-module/use.html
Beta Was this translation helpful? Give feedback.
All reactions