From 34e303f11e6c693047c127879a61a15502dc1fe6 Mon Sep 17 00:00:00 2001 From: jackymao Date: Fri, 19 Aug 2022 10:49:37 +0800 Subject: [PATCH] add function_parameters --- .../config.json" | 4 +- .../function_parameters.json" | 7 ++ .../function_parameters.md" | 88 +++++++++++++++++++ 3 files changed, 98 insertions(+), 1 deletion(-) create mode 100644 "data/1.rust\345\210\235\351\230\266/2.rust\345\237\272\346\234\254\346\246\202\345\277\265/6.\345\207\275\346\225\260\345\217\202\346\225\260/function_parameters.json" create mode 100644 "data/1.rust\345\210\235\351\230\266/2.rust\345\237\272\346\234\254\346\246\202\345\277\265/6.\345\207\275\346\225\260\345\217\202\346\225\260/function_parameters.md" diff --git "a/data/1.rust\345\210\235\351\230\266/2.rust\345\237\272\346\234\254\346\246\202\345\277\265/6.\345\207\275\346\225\260\345\217\202\346\225\260/config.json" "b/data/1.rust\345\210\235\351\230\266/2.rust\345\237\272\346\234\254\346\246\202\345\277\265/6.\345\207\275\346\225\260\345\217\202\346\225\260/config.json" index 7c2e028..6a74ef8 100644 --- "a/data/1.rust\345\210\235\351\230\266/2.rust\345\237\272\346\234\254\346\246\202\345\277\265/6.\345\207\275\346\225\260\345\217\202\346\225\260/config.json" +++ "b/data/1.rust\345\210\235\351\230\266/2.rust\345\237\272\346\234\254\346\246\202\345\277\265/6.\345\207\275\346\225\260\345\217\202\346\225\260/config.json" @@ -2,7 +2,9 @@ "node_id": "rust-2d5b0ce68c464757b1178481aafbcc7f", "keywords": [], "children": [], - "export": [], + "export": [ + "function_parameters.json" + ], "keywords_must": [], "keywords_forbid": [] } \ No newline at end of file diff --git "a/data/1.rust\345\210\235\351\230\266/2.rust\345\237\272\346\234\254\346\246\202\345\277\265/6.\345\207\275\346\225\260\345\217\202\346\225\260/function_parameters.json" "b/data/1.rust\345\210\235\351\230\266/2.rust\345\237\272\346\234\254\346\246\202\345\277\265/6.\345\207\275\346\225\260\345\217\202\346\225\260/function_parameters.json" new file mode 100644 index 0000000..5e53698 --- /dev/null +++ "b/data/1.rust\345\210\235\351\230\266/2.rust\345\237\272\346\234\254\346\246\202\345\277\265/6.\345\207\275\346\225\260\345\217\202\346\225\260/function_parameters.json" @@ -0,0 +1,7 @@ +{ + "type": "code_options", + "author": "jackymao_com", + "source": "function_parameters.md", + "notebook_enable": false, + "exercise_id": "" +} \ No newline at end of file diff --git "a/data/1.rust\345\210\235\351\230\266/2.rust\345\237\272\346\234\254\346\246\202\345\277\265/6.\345\207\275\346\225\260\345\217\202\346\225\260/function_parameters.md" "b/data/1.rust\345\210\235\351\230\266/2.rust\345\237\272\346\234\254\346\246\202\345\277\265/6.\345\207\275\346\225\260\345\217\202\346\225\260/function_parameters.md" new file mode 100644 index 0000000..06708fb --- /dev/null +++ "b/data/1.rust\345\210\235\351\230\266/2.rust\345\237\272\346\234\254\346\246\202\345\277\265/6.\345\207\275\346\225\260\345\217\202\346\225\260/function_parameters.md" @@ -0,0 +1,88 @@ +# 函数参数 + +函数名后面的小括号内放置参数,参数后面需要加冒号再加类型,一般函数的参数的数量是固定的。闭包的参数的两个竖线中间。宏看起来像函数,但在名称后面有感叹号,后面括号里面的参数数量可以不是固定的。 + +参数的类型可以是具体类型,也可以是泛型,还可以是 impl Trait 的形式。 + +在结构体的 impl 内部,如果定义的函数参数不包含 self (如 self, &self, &mut self),就是静态方法,需要使用 StructName::method 调用,如 String::from(), 如果有包含 self 为参数的函数,就是实例方法。 如 "Hello".to_string() 。 + +带有泛型和生命周期的函数参数相对复杂,但只要多看,熟悉了就好了。看得多了,很多时候只需浏览一个函数的签名,就可以知道该函数大部分的行为。譬如如下函数签名: + +```rust +// add 函数,left hand side 参数类型 i32, righ hand side 参数类型 i32, 返回 i32 类型 +fn add(lhs: i32, rhs: i32) -> i32 {} +``` + +```rust +fn play_with(dog_name: String, game_name: String) {} +``` + +```rust +struct Dog; +struct Game; +fn play_with(dog: Dog, game: Game); +``` + +```rust +fn foo(input: &mut T, val: T) {} +``` + +```rust +fn do_stuff(value: &T) {} + +// 上面这行等效于 + +fn do_stuff(value: &T) +where T: Clone +{} +``` + + +其它: +```rust + +fn print<'a>(s: &'a str); + +fn get_str() -> &str; + +fn args<'a, 'b, T: ToCStr>(&'a mut self, args: &'b [T]) -> &'a mut Command + +fn new(calculation: T) -> Cacher +where T: Fn(u32) -> u32, +{} + +fn tokenize<'a>(code: &'a str) -> impl Iterator {} + +async fn main() -> Result<(), std::io::Error> {} + +``` + + +如下函数签名解读错误的是: + +```rust +async fn handle_request(request: HttpRequest) -> HttpResponse {} +``` + +## 答案 + +它有两个参数 + +## 选项 + +### + +从 async 看出这是一个异步函数 + +### + +函数名是 handle_request + +### + +参数名是 request, 参数类型是 HttpRequest + +### + +返回类型是 HttpResponse + -- GitLab