{ "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, 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 }