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}