Project Related
.
├── Cargo.toml
├── Cargo.lock
├── src
│ ├── main.rs
│ ├── lib.rs
│ └── bin
│ └── main1.rs
│ └── main2.rs
├── tests
│ └── some_integration_tests.rs
├── benches
│ └── simple_bench.rs
└── examples
└── simple_example.rs
1. crate and mod
mod tree:
crate
└── dining
└── eat_at_restaurant
└── front_of_house
├── hosting
│ ├── add_to_waitlist
-
pub
,self
,super
:mod front_of_house { pub mod hosting { pub fn add_to_waitlist() {} } } pub fn eat_at_restaurant() { // absolute path crate::front_of_house::hosting::add_to_waitlist(); // relative path front_of_house::hosting::add_to_waitlist(); } fn serve_order() { self::back_of_house::cook_order(); } mod back_of_house { fn fix_incorrect_order() { cook_order(); super::serve_order(); } pub fn cook_order() {} }
-
use mod in other files:
mod front_of_house; // load this mod in the file of the same name pub use crate::front_of_house::hosting; pub fn eat_at_restaurant() { hosting::add_to_waitlist(); }
-
use multiple things:
use std::collections::{HashMap, BTreeMap, HashSet}; use std::io::{self, Write}; use std::collections::*;
-
limited visibility:
pub(crate)
orpub(crate::a)
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(in crate::a) mod c { pub(in crate::a) const J: i32 = 4; } } }
2. Comments
-
coding comments
// /* */
-
doc comments in lib type crates for functions or structs; markdown supported!
/// `add_one` 将指定值加1 /// /// # Examples /// /// ``` /// let arg = 5; /// let answer = my_crate::add_one(arg); /// assert_eq!(6, answer); /// ``` pub fn add_one(x: i32) -> i32 { x + 1 } /** `add_two` 将指定值加2 # Examples ``` let arg = 5; let answer = my_crate::add_two(arg); assert_eq!(7, answer); ``` */ pub fn add_two(x: i32) -> i32 { x + 2 }
-
comments for crates or mods on the top of source files:
//! /*! */
-
use complete path to call functions in Doc-tests (
cargo test
):/// `add_one` 将指定值加1 /// # Examples11 /// ``` /// let arg = 5; /// let answer = world_hello::compute::add_one(arg); /// assert_eq!(6, answer); /// ``` pub fn add_one(x: i32) -> i32 { x + 1 }
should_panic
:/// # Panics /// The function panics if the second argument is zero. /// ```rust,should_panic /// world_hello::compute::div(10, 0); /// ``` pub fn div(a: i32, b: i32) -> i32 { if b == 0 { panic!("Divide-by-zero error"); } a / b }
-
hide some codes by
#
:/// ``` /// # // 使用#开头的行会在文档中被隐藏起来,但是依然会在文档测试中运行 /// # fn try_main() -> Result<(), String> { /// let res = world_hello::compute::try_div(10, 0)?; /// # Ok(()) // returning from try_main /// # } /// # fn main() { /// # try_main().unwrap(); /// # /// # } /// ``` pub fn try_div(a: i32, b: i32) -> Result<i32, String> { if b == 0 { Err(String::from("Divide-by-zero")) } else { Ok(a / b) } }
-
rust /// [`Option`] can be used to jump to the doc of Option in std lib /// jump to [`Self::recv()`]
-
jumping between the same names:
/// 跳转到结构体 [`Foo`](struct@Foo) struct Bar; /// 跳转到同名函数 [`Foo`](fn@Foo) struct Foo {} /// 跳转到同名宏 [`foo!`] fn Foo() {} macro_rules! foo { () => {} }
-
alias for searching:
#[doc(alias = "x")] #[doc(alias = "big")] pub struct BigX; #[doc(alias("y", "big"))] pub struct BigY;
Last update:
March 2, 2022
Authors: