aboutsummaryrefslogtreecommitdiff
path: root/docs/_zh_CN/pages
diff options
context:
space:
mode:
author魏曹先生 <1992414357@qq.com>2026-05-03 00:57:45 +0800
committer魏曹先生 <1992414357@qq.com>2026-05-03 00:57:45 +0800
commit8f44a3e779fb8ee66c8f51b49d6c77e5a80e3821 (patch)
tree5b281084e889eabc941b8125cc3a66240ab9f287 /docs/_zh_CN/pages
parent332e52af1883bec57e2a6d1f1291e434f18cd0c9 (diff)
Add tool to fix blank lines around code blocks in Markdown
Diffstat (limited to 'docs/_zh_CN/pages')
-rw-r--r--docs/_zh_CN/pages/1-creating-your-first-program.md54
-rw-r--r--docs/_zh_CN/pages/2-implementing-fallbacks.md40
2 files changed, 47 insertions, 47 deletions
diff --git a/docs/_zh_CN/pages/1-creating-your-first-program.md b/docs/_zh_CN/pages/1-creating-your-first-program.md
index 27a7f6d..96932ba 100644
--- a/docs/_zh_CN/pages/1-creating-your-first-program.md
+++ b/docs/_zh_CN/pages/1-creating-your-first-program.md
@@ -26,11 +26,11 @@
```toml
[dependencies]
mingling = "0.1.7"
-
+
# 如果您要尝鲜,可以试试 Github 上托管的版本
mingling = { git = "https://github.com/catilgrass/mingling", branch = "main" }
```
-
+
> [!NOTE]
>
> 该版本基于文档编写时的 **Mingling** 版本,您可以前往 [crates.io](https://crates.io/crates/mingling) 查看最新的版本!😄
@@ -48,12 +48,12 @@ fn main() {
// 创建 ThisProgram,并执行
ThisProgram::new().exec();
}
-
+
// gen_program! 宏将会收集 *它之前* 的所有组件、类型
// 然后生成程序 `ThisProgram`
mingling::macros::gen_program!();
```
-
+
> [!TIP]
>
> `gen_Sprogram!()` 宏展开时,会收集在它之前展开的其他组件、类型的信息,这意味着您需要将 `gen_program!()` 放在整个 crate 中最后被展开的位置
@@ -70,15 +70,15 @@ mingling::macros::gen_program!();
fn main() {
// ...
}
-
+
// 创建分发器,并将 GreetCommand 绑定在 "greet" 子命令
// 在用户指定该命令时,向调度器发送 GreetEntry
dispatcher!("greet", GreetCommand => GreetEntry);
-
+
// ...
gen_program!();
```
-
+
不要被突然多出来的一个宏和两个类型所吓到!我来逐一解释这个宏干了什么:
##### 关于 `dispatcher!` 宏 💡
@@ -112,7 +112,7 @@ fn main() {
program.exec();
}
```
-
+
这样,`ThisProgram` 就认得 `"greet"` 子命令了,但是框架还不知道 `"greet"` 的行为是怎样的。此时我们便需要实现具体的逻辑:
@@ -124,24 +124,24 @@ fn main() {
```rust
// ...
dispatcher!("greet", GreetCommand => GreetEntry);
-
+
// 声明渲染器 `render_greet`,并表示前一个类型是 `GreetEntry`
#[renderer]
fn render_greet(_prev: GreetEntry) {
r_println!("Hello, World!");
}
-
+
// ...
gen_program!(); // 渲染器会被注册到程序
```
-
+
对于 `#[renderer]` 属性宏标记的函数,**Mingling** 严格规定只允许使用一种函数签名:
```rust
#[renderer]
fn renderer_name (_prev: PreviousType) { }
```
-
+
宏会读取到第一个参数的类型,并告诉 `gen_program!` 该函数用来渲染该类型。
##### 关于 `r_println!()` 💡
@@ -158,10 +158,10 @@ fn renderer_name (_prev: PreviousType) { }
```rust
dispatcher!("greet", GreetCommand => GreetEntry);
-
+
// 包装中间类型 `ResultGreetSomeone`
pack!(ResultGreetSomeone = String);
-
+
#[chain]
fn handle_greet_entry(prev: GreetEntry) -> NextProcess {
let args = prev.inner;
@@ -169,18 +169,18 @@ fn handle_greet_entry(prev: GreetEntry) -> NextProcess {
.first()
.cloned()
.unwrap_or_else(|| "World".to_string());
-
+
// 包装为中间类型
ResultGreetSomeone::new(name)
}
-
+
#[renderer]
fn render_greet_someone(prev: ResultGreetSomeone) {
// 解引用 prev 拿到原始类型
r_println!("Hello, {}!", *prev);
}
```
-
+
像 `#[renderer]` 一样,我们创建了一个 `#[chain]`,它处理类型 `GreetEntr`,输出 `ResultGreetSomeone`
这样我们就在原本的 `Dispatcher` 和 `Renderer` 中间插入了一个 `Chain`:它可以将用户输入的参数提取出来(或回退到默认值 "World"),再交由渲染器打印到终端。
@@ -204,7 +204,7 @@ fn render_greet_someone(prev: ResultGreetSomeone) {
```rust
pack!(PackedType = RawType);
```
-
+
不过请注意:`pack!` 宏不支持带有生命周期的类型包装,因为类型在调度器之间的流转方式永远都是 `move` 而非 `borrow`。
@@ -215,33 +215,33 @@ pack!(PackedType = RawType);
```rust
use mingling::macros::{chain, dispatcher, gen_program, pack, r_println, renderer};
-
+
fn main() {
let mut program = ThisProgram::new();
program.with_dispatcher(GreetCommand);
program.exec();
}
-
+
dispatcher!("greet", GreetCommand => GreetEntry);
-
+
pack!(ResultGreetSomeone = String);
-
+
#[chain]
fn handle_greet_entry(prev: GreetEntry) -> NextProcess {
let args = prev.inner;
let name = args.first().cloned().unwrap_or_else(|| "World".to_string());
-
+
ResultGreetSomeone::new(name)
}
-
+
#[renderer]
fn render_greet_someone(prev: ResultGreetSomeone) {
r_println!("Hello, {}!", *prev);
}
-
+
gen_program!();
```
-
+
运行结果:
```bash
@@ -250,7 +250,7 @@ Hello, World!
~> your-bin greet Alice
Hello, Alice!
```
-
+
<p align="center" style="font-size: 0.85em; color: gray;">
Written by @Weicao-CatilGrass
</p>
diff --git a/docs/_zh_CN/pages/2-implementing-fallbacks.md b/docs/_zh_CN/pages/2-implementing-fallbacks.md
index 071a5d1..5ed7242 100644
--- a/docs/_zh_CN/pages/2-implementing-fallbacks.md
+++ b/docs/_zh_CN/pages/2-implementing-fallbacks.md
@@ -13,7 +13,7 @@
~> your-bin hello
~> your-bin hello Alice
```
-
+
**它没有任何反应!** 👆
让我来解释为什么:**Mingling** 不自作主张,无论发生什么它都不会输出内容到终端(除了 `unwind` 下的 `panic!`)
@@ -34,20 +34,20 @@
```rust
// 1. 定义 `greet` 命令
dispatcher!("greet", GreetCommand => GreetEntry);
-
+
fn main() {
// ->> 用户输入 "hello Alice"
let mut program = ThisProgram::new();
-
+
// 2. 导入 `greet` 命令
program.with_dispatcher(GreetCommand);
-
+
// 3. 执行程序
program.exec();
}
-
+
// ...
-
+
// 5. 接收 DispatcherNotFound 调度
#[renderer]
fn dispatcher_not_found(prev: DispatcherNotFound) {
@@ -57,7 +57,7 @@ fn dispatcher_not_found(prev: DispatcherNotFound) {
prev.join(" ")
);
}
-
+
// 4. 无法匹配到任何名为 `hello` 的分发器
// 将用户参数原样分发到 DispatcherNotFound
gen_program!();
@@ -68,11 +68,11 @@ gen_program!();
```bash
~> omg hello
Cannot match any command! Current input: "hello"
-
+
~> omg hello Alice
Cannot match any command! Current input: "hello Alice"
```
-
+
现在若用户输入了不匹配的命令,**Mingling** 将会输出对应的内容!
## `RendererNotFound` 类型
@@ -86,30 +86,30 @@ Cannot match any command! Current input: "hello Alice"
```rust
dispatcher!("greet", GreetCommand => GreetEntry);
-
+
fn main() {
let mut program = ThisProgram::new();
-
+
program.with_dispatcher(GreetCommand);
program.exec();
}
-
+
pack!(ResultGreetSomeone = String);
-
+
#[chain]
fn handle_greet_entry(prev: GreetEntry) -> NextProcess {
let args = prev.inner;
let name = args.first().cloned().unwrap_or_else(|| "World".to_string());
-
+
ResultGreetSomeone::new(name)
}
-
+
// 让我们故意去除 `ResultGreetSomeone` 类型的渲染器实现
// #[renderer]
// fn render_greet_someone(prev: ResultGreetSomeone) {
// r_println!("Hello, {}!", *prev);
// }
-
+
#[renderer]
fn renderer_not_found(prev: RendererNotFound) {
if *prev == "DispatcherNotFound" {
@@ -119,16 +119,16 @@ fn renderer_not_found(prev: RendererNotFound) {
// 当未找到渲染器时触发 `panic!`
panic!("Renderer \"{}\" not found!", *prev);
}
-
+
gen_program!();
-
+
```
-
+
上述程序的运行效果为:
```bash
~> your-bin greet Alice
-
+
thread 'main' (90772) panicked at src/bin/your-bin.rs:30:5:
Renderer "ResultGreetSomeone" not found!
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace