Skip to content

Commit

Permalink
Update closure
Browse files Browse the repository at this point in the history
  • Loading branch information
XuShaohua committed Jan 6, 2024
1 parent 9789711 commit 3ae5310
Show file tree
Hide file tree
Showing 4 changed files with 63 additions and 52 deletions.
30 changes: 29 additions & 1 deletion src/closure/closure.md
Original file line number Diff line number Diff line change
@@ -1 +1,29 @@
# closure

# 闭包 Closure

可以捕获外部变量, 变量有三种方法被捕获:
- 只读引用 (read only)
- 可变引用 (mutable, modified)
- 值 (consumed), 如果该值实现了 `Copy` trait, 那就复制一份; 如果未实现, 就将该值 `move` 到 closure中.

当然, 也可以显式地加一个 `move` 标记, 将一个变量移到closure内.

自加1:
```rust
let accum = |s: i32| -> i32 { s + 1 };
```

返回一个常数1:
```rust
let one = || 1;
```

也可以获取被捕获变量的所有权:
```rust
let square = move |point: Point| -> i32 { point.x + point.y };
```

Rust中的闭包性能跟一般的函数一样, 而且要比函数指针还要快.

## 作为输出参数
一个高阶函数也可以返回一个函数, 但需要加入 `impl` 前缀.
23 changes: 23 additions & 0 deletions src/closure/fn-mut-once.md
Original file line number Diff line number Diff line change
@@ -1 +1,24 @@

# Fn, FnMut and FnOnce

作为输入参数. 比如, 作为一个高阶函数的输入参数时, 闭包 closure 可以有三种声明:
- Fn, 对应于 "引用" (reference)
- FnMut, 对应于 "可变引用" (mutable reference)
- FnOnce, 对应于 "值" (consumed value)

## Generic
Function Trait:
```rust
fn apply_to_3<F>(f: F) -> i32
where F: Fn(i32) -> i32,
{
return f(3);
}
```

区别:
- `fn(...) -> ...`, 函数类型,只能是一般的函数
- `Fn(...) -> ...`, 泛型函数,可以是一般的函数, 也可以是闭包

## FnOnce
`FnOnce()` 这种声明的函数, 只能被调用一次, 通常是因为有值移到了函数内部, 转移了所有权.
27 changes: 10 additions & 17 deletions src/closure/function.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,19 @@

## Diverging functions
就是一个函数不返回任何值, 比如一个 loop 无限循环, 或者线程会到止退出的.
目前, 只能通过调用 `panic!()` 或者 `unreachable!()` 来实现.

## Generic
Function Trait:
```rust
fn apply_to_3<F>(f: F) -> i32
where F: Fn(i32) -> i32,
{
return f(3);
目前, 只能通过调用 `panic!()` 或者 `unreachable!()` 来实现:

```no_run
impl Server {
pub fn run(self) -> ! {
loop {
...
}
}
}
```

区别:
* `fn(...) -> ...`, 函数类型,只能是一般的函数.
* `Fn(...) -> ...`, 泛型函数,可以是一般的函数, 也可以是闭包.


## 作为返回值
```rust
fn create_fnmut() -> impl FnMut() {
Expand All @@ -28,7 +24,4 @@ fn create_fnmut() -> impl FnMut() {

let mut f = create_fnmut();
f();
```

## FnOnce
`FnOnce()` 这种声明的函数, 只能被调用一次, 通常是因为有值移到了函数内部, 转移了所有权.
```
35 changes: 1 addition & 34 deletions src/closure/index.md
Original file line number Diff line number Diff line change
@@ -1,35 +1,2 @@

# 闭包 Closure

可以捕获外部变量, 变量有三种方法被捕获:
* 引用 (read only)
* 可变引用 (mutable, modified)
* 值 (consumed), 如果该值实现了 `Copy` trait, 那就复制一份; 如果未实现, 就将该值 `move` 到 closure中.

当然, 也可以显式地加一个 `move` 标记, 将一个变量移到closure内.

自加1:
```rust
let accum = |s: i32| -> i32 { s + 1 };
```

返回一个常数1:
```rust
let one = || 1;
```

也可以获取被捕获变量的所有权:
```rust
let square = move |point: Point| -> i32 { point.x + point.y };
```

Rust中,闭包性能跟一般的函数一样,而且要比函数指针还要快。

## 作为输入参数
比如, 作为一个高阶函数的输入参数时, closure 可以有三种声明:
* Fn, 对应于 `引用`
* FnMut, 对应于 `可变引用`
* FnOnce, 对应于 ``

## 作为输出参数
一个高阶函数也可以返回一个函数, 但需要加入 `impl` 前缀.
# 函数

0 comments on commit 3ae5310

Please sign in to comment.