sui_rust/ch01/
lexical.rs

1#![allow(unused_variables)]
2//! 第一章:Rust语言基础
3//! 1.3 语法面面观(一) 词法结构
4//!
5//! 包括:
6//!    1. Rust 语言版本说明
7//!    2. Rust 词法结构
8
9/**
10
11    # 标识符:
12
13   ```rust
14   let thinking = "thinking";
15   let thinking123_ = "thinking 123";
16
17   // error: invalid suffix `thinking` for integer literal
18   // let 321_thinking = "thinking";
19
20   // ok
21   let _321_thinking = "thinking";
22
23   // non-ascii ident
24   // RFC: https://github.com/rust-lang/rfcs/blob/master/text/2457-non-ascii-idents.md
25   // error: unknown start of token: \u{1f914}
26   //  let 🤔 = "thinking ";
27   ```
28
29*/
30pub fn ident_show() {
31    let thinking = "thinking";
32
33    // non-ascii ident
34    // RFC: https://github.com/rust-lang/rfcs/blob/master/text/2457-non-ascii-idents.md
35    // error: unknown start of token: \u{1f914}
36    //  let 🤔 = "thinking ";
37}
38
39/**
40
41    # 声明宏示例
42
43    ```rust
44    macro_rules! calculate {
45        (eval $e:expr) => {{
46            {
47                let val: usize = $e; // Force types to be integers
48                println!("{} = {}", stringify!{$e}, val);
49            }
50        }};
51    }
52
53    fn main() {
54        calculate! {
55            eval 1 + 2 // hehehe `eval` is _not_ a Rust keyword!
56        }
57
58        calculate! {
59            eval (1 + 2) * (3 / 4)
60        }
61    }
62    ```
63*/
64pub fn macro_show() {
65    macro_rules! calculate {
66        (eval $e:expr) => {{
67            {
68                let val: usize = $e; // Force types to be integers
69                println!("{} = {}", stringify!{$e}, val);
70            }
71        }};
72    }
73
74    calculate! {
75        eval 1 + 2 // hehehe `eval` is _not_ a Rust keyword!
76    }
77
78    calculate! {
79        eval (1 + 2) * (3 / 4)
80    }
81}
82
83/**
84
85    # Path 展示
86
87    ```
88    // 模块路径
89    mod a {
90        fn foo() {}
91
92        mod b {
93            mod c {
94                fn foo() {
95                    super::super::foo(); // call a's foo function
96                    self::super::super::foo(); // call a's foo function
97                }
98            }
99        }
100    }
101
102    // 方法调用
103
104    struct S;
105    impl S {
106        fn f() { println!("S"); }
107    }
108    trait T1 {
109        fn f() { println!("T1 f"); }
110    }
111    impl T1 for S {}
112    trait T2 {
113        fn f() { println!("T2 f"); }
114    }
115    impl T2 for S {}
116    S::f();  // Calls the inherent impl.
117    // 完全限定无歧义调用
118    <S as T1>::f();  // Calls the T1 trait function.
119    <S as T2>::f();  // Calls the T2 trait function.
120
121
122    // 泛型函数-turbofish操作符
123    (0..10).collect::<Vec<_>>();
124    Vec::<u8>::with_capacity(1024);
125    ```
126
127*/
128pub fn path_show() {
129    (0..10).collect::<Vec<_>>();
130    Vec::<u8>::with_capacity(1024);
131}
132
133/**
134    # 注释示例
135    pub mod outer_module {
136
137        //!  - 模块级文档注释,置于模块头部
138        //!! - 模块级文档注释,但是和上面注释置于同一行
139
140        //!  - 模块级文档注释,但会换行
141
142        /*!  - 模块块级文档注释 */
143        /*!! - 模块级注释,但是和上面注释置于同一行 */
144
145        /*!  - 模块块级注释,但会换行 */
146
147        //   - 普通行注释
148        ///  - 行级文档注释 ( 必须是 3 个斜杠)
149        //// - 普通行注释
150
151        /*   - 普通块级注释 */
152        /**  - 块级文档注释 (精确) 2 个星号 */
153        /*** - 普通注释 */
154
155        pub mod inner_module {}
156
157        pub mod nested_comments {
158            /* Rust 中的注释内/* 可以 /* 嵌入注释 */ */ */
159
160            // 所有三种块注释都可以相互包含或嵌套
161
162            /*   /* */  /** */  /*! */  */
163            /*!  /* */  /** */  /*! */  */
164            /**  /* */  /** */  /*! */  */
165            pub mod dummy_item {}
166        }
167
168        pub mod degenerate_cases {
169            // 空的模块级文档注释
170            //!
171
172            // 空的模块块级文档注释
173            /*!*/
174
175            // 空的行注释
176            //
177
178            // empty outer line doc
179            /// 空的行级文档注释
180
181            // 空的块注释
182            /**/
183
184            pub mod dummy_item {}
185
186            // 注意,此处不是空的块级文档注释,而只是一个普通的块级注释
187            /***/
188
189        }
190
191        /*
192        下面这种文档注释是不允许的,因为文档注释下面必须要有语言项,比如方法、函数等
193        /// Where is my item?
194        */
195    }
196
197*/
198pub mod outer_module {
199
200    //!  - 模块级文档注释,置于模块头部
201    //!! - 模块级文档注释,但是和上面注释置于同一行
202
203    //!  - 模块级文档注释,但会换行
204
205    /*!  - 模块块级文档注释 */
206    /*!! - 模块级注释,但是和上面注释置于同一行 */
207
208    /*!  - 模块块级注释,但会换行 */
209
210    //   - 普通行注释
211    ///  - 行级文档注释 ( 必须是 3 个斜杠)
212    //// - 普通行注释
213
214    /*   - 普通块级注释 */
215    /**  - 块级文档注释 (精确) 2 个星号 */
216    /*** - 普通注释 */
217
218    pub mod inner_module {}
219
220    /// mod 定义个模块
221    pub mod nested_comments {
222        /* Rust 中的注释内/* 可以 /* 嵌入注释 */ */ */
223
224        // 所有三种块注释都可以相互包含或嵌套
225
226        /*   /* */  /** */  /*! */  */
227        /*!  /* */  /** */  /*! */  */
228        /**  /* */  /** */  /*! */  */
229        pub mod dummy_item {}
230    }
231
232    pub mod degenerate_cases {
233        // 空的模块级文档注释
234        //!
235
236        // 空的模块块级文档注释
237        /*!*/
238
239        // 空的行注释
240        //
241
242        // empty outer line doc
243        /// 空的行级文档注释
244
245        // 空的块注释
246        /**/
247
248        pub mod dummy_item {}
249
250        // 注意,此处不是空的块级文档注释,而只是一个普通的块级注释
251        /***/
252    }
253
254    /*
255    下面这种文档注释是不允许的,因为文档注释下面必须要有语言项,比如方法、函数等
256    /// Where is my item?
257    */
258}