187 lines
3.5 KiB
Text
187 lines
3.5 KiB
Text
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"# Closures"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"1. Define a closure that adds two numbers and use it in `main`."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "900b12e8",
|
|
"metadata": {
|
|
"vscode": {
|
|
"languageId": "rust"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"\n",
|
|
"fn main() {\n",
|
|
" let add = __;\n",
|
|
" \n",
|
|
" let result = add(2, 3);\n",
|
|
" assert_eq!(result, 5);\n",
|
|
" println!(\"Success!\");\n",
|
|
"}\n",
|
|
"\n",
|
|
"main();\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "81717c46",
|
|
"metadata": {},
|
|
"source": [
|
|
"2. Create a closure that captures a variable from the surrounding scope."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "15a2bd11",
|
|
"metadata": {
|
|
"vscode": {
|
|
"languageId": "rust"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"fn main() {\n",
|
|
" let multiplier = 3;\n",
|
|
" let multiply = __;\n",
|
|
"\n",
|
|
" assert_eq!(multiply(4), 12);\n",
|
|
" println!(\"Success!\");\n",
|
|
"}\n",
|
|
"\n",
|
|
"main();\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "8a3becbc",
|
|
"metadata": {},
|
|
"source": [
|
|
"3. Pass a closure into a generic function that accepts `Fn(i32) -> i32`."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "015aebe2",
|
|
"metadata": {
|
|
"vscode": {
|
|
"languageId": "rust"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"fn apply<F>(f: F, value: i32) -> i32\n",
|
|
"where\n",
|
|
" F: Fn(i32) -> i32,\n",
|
|
"{\n",
|
|
" f(value)\n",
|
|
"}\n",
|
|
"\n",
|
|
"fn main() {\n",
|
|
" let add_one = __;\n",
|
|
" let result = apply(add_one, 10);\n",
|
|
"\n",
|
|
" assert_eq!(result, 11);\n",
|
|
" println!(\"Success!\");\n",
|
|
"}\n",
|
|
"\n",
|
|
"main();\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "5ba5c844",
|
|
"metadata": {},
|
|
"source": [
|
|
"4. Use a mutable closure that updates a captured counter each time it is called."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "b37b49eb",
|
|
"metadata": {
|
|
"vscode": {
|
|
"languageId": "rust"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"fn main() {\n",
|
|
" let mut counter = 0;\n",
|
|
" let mut increment = __;\n",
|
|
"\n",
|
|
" assert_eq!(increment(), 1);\n",
|
|
" assert_eq!(increment(), 2);\n",
|
|
" println!(\"Success!\");\n",
|
|
"}\n",
|
|
"\n",
|
|
"main();\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "637a4a78",
|
|
"metadata": {},
|
|
"source": [
|
|
"5. Create a `move` closure that takes ownership of a captured `String`."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "58d65ccc",
|
|
"metadata": {
|
|
"vscode": {
|
|
"languageId": "rust"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"fn main() {\n",
|
|
" let message = String::from(\"Hello\");\n",
|
|
" let consume = __;\n",
|
|
"\n",
|
|
" let result = consume();\n",
|
|
" assert_eq!(result, \"Hello world!!!\");\n",
|
|
" println!(\"Success!\");\n",
|
|
"}\n",
|
|
"\n",
|
|
"main();"
|
|
]
|
|
}
|
|
],
|
|
"metadata": {
|
|
"kernelspec": {
|
|
"display_name": "Rust",
|
|
"language": "rust",
|
|
"name": "rust"
|
|
},
|
|
"language_info": {
|
|
"codemirror_mode": "rust",
|
|
"file_extension": ".rs",
|
|
"mimetype": "text/rust",
|
|
"name": "Rust",
|
|
"pygment_lexer": "rust",
|
|
"version": ""
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 5
|
|
}
|