From 202af55de8bd50810bad01b66750f4d808436ac8 Mon Sep 17 00:00:00 2001 From: Mosamorphing <121625762+Mosamorphing@users.noreply.github.com> Date: Fri, 19 Jul 2024 19:23:54 +0100 Subject: [PATCH 01/24] Create readme.md --- Languages/en/01_HelloRust/readme.md | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 Languages/en/01_HelloRust/readme.md diff --git a/Languages/en/01_HelloRust/readme.md b/Languages/en/01_HelloRust/readme.md new file mode 100644 index 0000000..2e87585 --- /dev/null +++ b/Languages/en/01_HelloRust/readme.md @@ -0,0 +1,10 @@ +--- +title: 1. Hello Rust +tags: + - Rust + - Install + - Cargo + - wtfacademy +--- + +# WTF Rust 极简入门: 1. Hello Rust From 479ce9272943aa9e7ef1fededfb176bf83d9505c Mon Sep 17 00:00:00 2001 From: Mosamorphing <121625762+Mosamorphing@users.noreply.github.com> Date: Fri, 19 Jul 2024 19:29:19 +0100 Subject: [PATCH 02/24] Update readme.md --- Languages/en/01_HelloRust/readme.md | 63 ++++++++++++++++++++++++++++- 1 file changed, 62 insertions(+), 1 deletion(-) diff --git a/Languages/en/01_HelloRust/readme.md b/Languages/en/01_HelloRust/readme.md index 2e87585..6852f4e 100644 --- a/Languages/en/01_HelloRust/readme.md +++ b/Languages/en/01_HelloRust/readme.md @@ -7,4 +7,65 @@ tags: - wtfacademy --- -# WTF Rust 极简入门: 1. Hello Rust +# WTF Rust Minimalist Introduction: 1. Hello Rust + +I have recently studied `Rust`, consolidate the details, and also write a` WTF Rust minimalist in the door, for Xiaobai to use (programming big guys can find another tutorial), update 1-3 a week. + +## Rust profile + +`Rust` is a systemic programming language, developed by Mozilla Research, focusing on safety, speed and concurrency. It aims to help developers build a reliable and efficient software system while preventing common security vulnerabilities, such as empty pointer references, buffer overflow, etc. + +The design concept of Rust` includes zero -cost abstraction, ensuring memory safety, incompetent competition, and pragmatism. It ensures the safety of memory through the mechanisms such as OWNERSHIP, borrowing, and life cycle (Lifetimes), while avoiding the performance expenses brought by garbage recycling. + +## Install rust + +First, we need to install `Rust` on your machine. `Rust` has a great installation tool, called` Rustup`, which will help us manage the version and the corresponding tool chain. Let's install it! + +Install the following commands on the following commands + +Open your terminal (or command line) and enter the following command: + +`` `Bash +Curl -ProTo '= https' --tlsv1.2 --ssf https://sh.rustup.rs | SH +`` ` + +This command will download a script and execute. The script will automatically install the default versions of `Rustup` and Rust (including` Rustc`, Rust's compiler, and `Cargo`, Rust's package management tool). According to the instructions in the terminal, after everything is proper, we can enter the next step! + +After the installation is completed, you can check the RUST version by running the `Rustc -" command to verify whether the installation is successful. If you can't find the `Rustc`, it is an environmental variable problem. You can view the directory` ~/.cargo/bin` whether to add it to the `Path`. You can restart the terminal or manual source to make the environment take effect. + +If it is the `Windows` system, please refer to [Official Installation Instructions] + +## Hello Rust program + +In the journey of programming language, the program is the first step of the traditional. It is the simplest program that "ask well" to the world. It is no exception in Rust, let's try it! + +1. Create a new folder, named `Hello_rust`, and then enter this folder. +2. In the `Hello_rust` folder, create a new file, named` main.rs`. The file name `.s` suffix represents a RUST source file. +3. Open the `main.rs`, use your favorite text editor, enter the following code: + +`` `rust +fn main () { + Println! ("Hello, Rust!"); +} +`` ` + +To explain briefly, this code defines a function `main`, which is the entrance point of each Rust program. When the Rust program runs, it executes the code in the `main` function. `Println!` is a macro (we talk about macro in the future), used to output text to the terminal. + +4. Save the file and return to the terminal to make sure you are in the `Hello_rust` folder, and then enter the following command to compile and run your program: + +`` `Bash +Rustc Main.rs +./main +`` ` + +If you are a user, the command of the running program may be slightly different, such as entering the `main` directly. + +If everything goes well, your terminal will output: + +`` ` +Hello, Rust! +`` ` + +Congratulations, you have successfully run your first Rust program! + +## Use Cargo From b78d81cfe6f98cd362473ba8b2b3e63e69c02e17 Mon Sep 17 00:00:00 2001 From: Mosamorphing <121625762+Mosamorphing@users.noreply.github.com> Date: Fri, 19 Jul 2024 19:32:03 +0100 Subject: [PATCH 03/24] Update readme.md --- Languages/en/01_HelloRust/readme.md | 41 +++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/Languages/en/01_HelloRust/readme.md b/Languages/en/01_HelloRust/readme.md index 6852f4e..8e51b2b 100644 --- a/Languages/en/01_HelloRust/readme.md +++ b/Languages/en/01_HelloRust/readme.md @@ -69,3 +69,44 @@ Hello, Rust! Congratulations, you have successfully run your first Rust program! ## Use Cargo + +In Rust's world, `Cargo` is your good friend. It is not only a bag management tool, but also helps you build projects, download dependencies, run tests, and so on. Let's take a look at how to use the `Cargo` to create and run a new project. + +1. Open the terminal and enter the following command to create a new RUST project: + +`` `Bash +Cargo new hello_cargo +`` ` + +This command will create a new folder called `Hello_cargo`, which contains a preliminary project structure. + +2. Enter the `Hello_cargo` folder, you will find that there are two main files:` cargo.toml` and `src/main.rs`. `Cargo.toml` is your project configuration file, while` src/main.rs` is your main program file, which has the default `Hello, Rust!` Code. + +3. Let's compile and run the project directly to see the magic of `Cargo`! In the terminal of the `hello_cargo` folder, enter the following command: + +`` `Bash +Cargo run +`` ` + +`Cargo Run` command will automatically compile your code (if necessary) and run the generated program. You should see the greetings of `Hello, Rust!` In the terminal. + + +4. If you use Rustrover, you can directly run the program directly in the `Cargo` plug -in that comes with your own` Cargo` plug -in to facilitate the rapid verification of the program. + +! [img.png] (imgs/img.png) + +5. In the demonstration code in the subsequent chapters, I will use `Cargo` to demonstrate, so that everyone will run and test. + +that's all! Now, you already know how to install the `Rust`, write and run the` Rust` program, and use the simple item to manage the `Cargo`. This is just the tip of the iceberg. The world of `Rust` is full of possibilities and adventures waiting for you. Are you ready? Let's move forward and go deep into the wonderful journey of `Rust`! + +## Summary + +This chapter mainly introduces the `Rust` installation method, write the first` Rust` program --`hello Rust`, and introduce how to use `Cargo` for project development + + + + + + + + From ad408e311458c1579fd1eb6124d02ef21ee3db91 Mon Sep 17 00:00:00 2001 From: Mosamorphing <121625762+Mosamorphing@users.noreply.github.com> Date: Fri, 19 Jul 2024 19:33:07 +0100 Subject: [PATCH 04/24] Update readme.md --- Languages/en/01_HelloRust/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Languages/en/01_HelloRust/readme.md b/Languages/en/01_HelloRust/readme.md index 8e51b2b..be24903 100644 --- a/Languages/en/01_HelloRust/readme.md +++ b/Languages/en/01_HelloRust/readme.md @@ -33,7 +33,7 @@ This command will download a script and execute. The script will automatically i After the installation is completed, you can check the RUST version by running the `Rustc -" command to verify whether the installation is successful. If you can't find the `Rustc`, it is an environmental variable problem. You can view the directory` ~/.cargo/bin` whether to add it to the `Path`. You can restart the terminal or manual source to make the environment take effect. -If it is the `Windows` system, please refer to [Official Installation Instructions] +If it is the `Windows` system, please refer to [Official Installation Instructions](https://forge.rust-lang.org/infra/other-installation-methods.html) ## Hello Rust program From 027a1511dfddd3f5ed0c4d96800eac94eebc3a06 Mon Sep 17 00:00:00 2001 From: Mosamorphing <121625762+Mosamorphing@users.noreply.github.com> Date: Fri, 19 Jul 2024 19:42:25 +0100 Subject: [PATCH 05/24] Update readme.md --- Languages/en/01_HelloRust/readme.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Languages/en/01_HelloRust/readme.md b/Languages/en/01_HelloRust/readme.md index be24903..de7e585 100644 --- a/Languages/en/01_HelloRust/readme.md +++ b/Languages/en/01_HelloRust/readme.md @@ -21,17 +21,17 @@ The design concept of Rust` includes zero -cost abstraction, ensuring memory saf First, we need to install `Rust` on your machine. `Rust` has a great installation tool, called` Rustup`, which will help us manage the version and the corresponding tool chain. Let's install it! -Install the following commands on the following commands +On `macOS`, `Linux`, or Unix-like operating systems, install using the following command: Open your terminal (or command line) and enter the following command: -`` `Bash -Curl -ProTo '= https' --tlsv1.2 --ssf https://sh.rustup.rs | SH -`` ` +```Bash +curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh +``` -This command will download a script and execute. The script will automatically install the default versions of `Rustup` and Rust (including` Rustc`, Rust's compiler, and `Cargo`, Rust's package management tool). According to the instructions in the terminal, after everything is proper, we can enter the next step! +This command will download a script and execute it. The script will automatically install `rustup` and the default version of Rust (including `rustc`, the Rust compiler, and `cargo`, the Rust package manager). Follow the instructions in the terminal, and once everything is set up, we can proceed to the next step! -After the installation is completed, you can check the RUST version by running the `Rustc -" command to verify whether the installation is successful. If you can't find the `Rustc`, it is an environmental variable problem. You can view the directory` ~/.cargo/bin` whether to add it to the `Path`. You can restart the terminal or manual source to make the environment take effect. +After installation is complete, you can check the Rust version by running the `rustc --version` command to verify if the installation was successful. If it indicates that `rustc` cannot be found, it is an environment variable issue. Check whether the directory `~/.cargo/bin` has been added to `PATH`. You can restart the terminal or manually source it to apply the environment changes. If it is the `Windows` system, please refer to [Official Installation Instructions](https://forge.rust-lang.org/infra/other-installation-methods.html) From 7acc368c4c4d6ce178bd1327b6f553726c18eba6 Mon Sep 17 00:00:00 2001 From: Mosamorphing <121625762+Mosamorphing@users.noreply.github.com> Date: Fri, 19 Jul 2024 19:46:02 +0100 Subject: [PATCH 06/24] Update readme.md --- Languages/en/01_HelloRust/readme.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Languages/en/01_HelloRust/readme.md b/Languages/en/01_HelloRust/readme.md index de7e585..2675c07 100644 --- a/Languages/en/01_HelloRust/readme.md +++ b/Languages/en/01_HelloRust/readme.md @@ -9,17 +9,17 @@ tags: # WTF Rust Minimalist Introduction: 1. Hello Rust -I have recently studied `Rust`, consolidate the details, and also write a` WTF Rust minimalist in the door, for Xiaobai to use (programming big guys can find another tutorial), update 1-3 a week. +I am recently relearning `Rust` to solidify the details and to write a `WTF Rust Minimalist Introduction` for beginners (advanced programmers can find other tutorials). I will update it 1-3 times per week. -## Rust profile +## Introduction to Rust -`Rust` is a systemic programming language, developed by Mozilla Research, focusing on safety, speed and concurrency. It aims to help developers build a reliable and efficient software system while preventing common security vulnerabilities, such as empty pointer references, buffer overflow, etc. +`Rust` is a systems programming language developed by Mozilla Research, focusing on safety, speed, and concurrency. It aims to help developers build reliable, efficient software systems while preventing common security vulnerabilities, such as null pointer dereferences and buffer overflows. -The design concept of Rust` includes zero -cost abstraction, ensuring memory safety, incompetent competition, and pragmatism. It ensures the safety of memory through the mechanisms such as OWNERSHIP, borrowing, and life cycle (Lifetimes), while avoiding the performance expenses brought by garbage recycling. +The design principles of `Rust` include zero-cost abstractions, guaranteed memory safety, data-race-free concurrency, and pragmatism. Through mechanisms like ownership, borrowing, and lifetimes, it ensures memory safety while avoiding the performance overhead of garbage collection. -## Install rust +## Installing Rust -First, we need to install `Rust` on your machine. `Rust` has a great installation tool, called` Rustup`, which will help us manage the version and the corresponding tool chain. Let's install it! +First, we need to install `Rust` on your machine. `Rust` has a fantastic installation tool called `rustup`, which helps us manage `Rust` versions and the corresponding toolchains. Let's install it! On `macOS`, `Linux`, or Unix-like operating systems, install using the following command: From ed08a0845f23d7e8bdb5241e6ce2a834ece391e9 Mon Sep 17 00:00:00 2001 From: Mosamorphing <121625762+Mosamorphing@users.noreply.github.com> Date: Fri, 19 Jul 2024 19:48:22 +0100 Subject: [PATCH 07/24] Update readme.md --- Languages/en/01_HelloRust/readme.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/Languages/en/01_HelloRust/readme.md b/Languages/en/01_HelloRust/readme.md index 2675c07..c951595 100644 --- a/Languages/en/01_HelloRust/readme.md +++ b/Languages/en/01_HelloRust/readme.md @@ -43,28 +43,28 @@ In the journey of programming language, the program is the first step of the tra 2. In the `Hello_rust` folder, create a new file, named` main.rs`. The file name `.s` suffix represents a RUST source file. 3. Open the `main.rs`, use your favorite text editor, enter the following code: -`` `rust +```rust fn main () { Println! ("Hello, Rust!"); } -`` ` +``` To explain briefly, this code defines a function `main`, which is the entrance point of each Rust program. When the Rust program runs, it executes the code in the `main` function. `Println!` is a macro (we talk about macro in the future), used to output text to the terminal. 4. Save the file and return to the terminal to make sure you are in the `Hello_rust` folder, and then enter the following command to compile and run your program: -`` `Bash +```Bash Rustc Main.rs ./main -`` ` +``` If you are a user, the command of the running program may be slightly different, such as entering the `main` directly. If everything goes well, your terminal will output: -`` ` +``` Hello, Rust! -`` ` +``` Congratulations, you have successfully run your first Rust program! @@ -74,9 +74,9 @@ In Rust's world, `Cargo` is your good friend. It is not only a bag management to 1. Open the terminal and enter the following command to create a new RUST project: -`` `Bash +```Bash Cargo new hello_cargo -`` ` +``` This command will create a new folder called `Hello_cargo`, which contains a preliminary project structure. @@ -84,16 +84,16 @@ This command will create a new folder called `Hello_cargo`, which contains a pre 3. Let's compile and run the project directly to see the magic of `Cargo`! In the terminal of the `hello_cargo` folder, enter the following command: -`` `Bash +```Bash Cargo run -`` ` +``` `Cargo Run` command will automatically compile your code (if necessary) and run the generated program. You should see the greetings of `Hello, Rust!` In the terminal. 4. If you use Rustrover, you can directly run the program directly in the `Cargo` plug -in that comes with your own` Cargo` plug -in to facilitate the rapid verification of the program. -! [img.png] (imgs/img.png) +![img.png](imgs/img.png) 5. In the demonstration code in the subsequent chapters, I will use `Cargo` to demonstrate, so that everyone will run and test. From c24aac398c4151bc6533a59d7d0ff35bc8fa7b1b Mon Sep 17 00:00:00 2001 From: Mosamorphing <121625762+Mosamorphing@users.noreply.github.com> Date: Fri, 19 Jul 2024 19:54:59 +0100 Subject: [PATCH 08/24] Create img.png --- Languages/en/01_HelloRust/imgs/img.png | 1 + 1 file changed, 1 insertion(+) create mode 100644 Languages/en/01_HelloRust/imgs/img.png diff --git a/Languages/en/01_HelloRust/imgs/img.png b/Languages/en/01_HelloRust/imgs/img.png new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/Languages/en/01_HelloRust/imgs/img.png @@ -0,0 +1 @@ + From 5f429bf3c054036111d99e6e6328fb9eb57fe7e2 Mon Sep 17 00:00:00 2001 From: Mosamorphing <121625762+Mosamorphing@users.noreply.github.com> Date: Fri, 19 Jul 2024 19:55:22 +0100 Subject: [PATCH 09/24] Add files via upload --- Languages/en/01_HelloRust/imgs/img.png | Bin 1 -> 57842 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Languages/en/01_HelloRust/imgs/img.png b/Languages/en/01_HelloRust/imgs/img.png index 8b137891791fe96927ad78e64b0aad7bded08bdc..36a63230d2c609565236bc2cbb1d5ab8b0f670be 100644 GIT binary patch literal 57842 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

HT?65rZFMd57AMi^T{{Y8c(H+#L_jv6$s2% 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

RX{GdGQ;DchMg{-GAg)Md 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 z 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 Date: Fri, 19 Jul 2024 20:10:07 +0100 Subject: [PATCH 10/24] Create main.rs --- Languages/en/01_HelloRust/hello_cargo/src/main.rs | 1 + 1 file changed, 1 insertion(+) create mode 100644 Languages/en/01_HelloRust/hello_cargo/src/main.rs diff --git a/Languages/en/01_HelloRust/hello_cargo/src/main.rs b/Languages/en/01_HelloRust/hello_cargo/src/main.rs new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/Languages/en/01_HelloRust/hello_cargo/src/main.rs @@ -0,0 +1 @@ + From 0234117a175939de9ed51f6e4787853ef512c70c Mon Sep 17 00:00:00 2001 From: Mosamorphing <121625762+Mosamorphing@users.noreply.github.com> Date: Fri, 19 Jul 2024 20:11:34 +0100 Subject: [PATCH 11/24] Update main.rs --- Languages/en/01_HelloRust/hello_cargo/src/main.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Languages/en/01_HelloRust/hello_cargo/src/main.rs b/Languages/en/01_HelloRust/hello_cargo/src/main.rs index 8b13789..430e888 100644 --- a/Languages/en/01_HelloRust/hello_cargo/src/main.rs +++ b/Languages/en/01_HelloRust/hello_cargo/src/main.rs @@ -1 +1,3 @@ - +fn main() { + println!("Hello, rust!"); +} From 10138b23ad1a0e9888363c84255632bbc1ec9a2b Mon Sep 17 00:00:00 2001 From: Mosamorphing <121625762+Mosamorphing@users.noreply.github.com> Date: Fri, 19 Jul 2024 20:13:09 +0100 Subject: [PATCH 12/24] Create Cargo.toml --- Languages/en/01_HelloRust/hello_cargo/Cargo.toml | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 Languages/en/01_HelloRust/hello_cargo/Cargo.toml diff --git a/Languages/en/01_HelloRust/hello_cargo/Cargo.toml b/Languages/en/01_HelloRust/hello_cargo/Cargo.toml new file mode 100644 index 0000000..4ab7042 --- /dev/null +++ b/Languages/en/01_HelloRust/hello_cargo/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "hello_cargo" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] + +[profile.dev] +debug = true # Include debug info +opt-level = 0 # No optimization From 3f7a22ddd4cf32f8a71c33fadc6b46592bf72a52 Mon Sep 17 00:00:00 2001 From: Mosamorphing <121625762+Mosamorphing@users.noreply.github.com> Date: Fri, 19 Jul 2024 15:21:03 -0700 Subject: [PATCH 13/24] Create README.md --- Languages/en/02_BaseType/README.md | 145 +++++++++++++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 Languages/en/02_BaseType/README.md diff --git a/Languages/en/02_BaseType/README.md b/Languages/en/02_BaseType/README.md new file mode 100644 index 0000000..4d3e146 --- /dev/null +++ b/Languages/en/02_BaseType/README.md @@ -0,0 +1,145 @@ +--- +title: 2. Base Type +tags: +- Rust +- Variables +- wtfacademy +--- + +# WTF Rust Minimalist Introduction: Base Types + +In this chapter, we will explore the basic syntax elements in Rust through examples with detailed explanations. We will cover variables and mutability, as well as data types (including scalar and compound types). + +## Variables and Mutability + +In Rust, variables are immutable by default. This means that once a value is assigned to a variable, you cannot change it. However, you can use the `mut` keyword to make a variable mutable. + +### Immutable Variables + +```rust +let x = 5; +println!("The value of x is: {}", x); +// x = 6; // This line will cause a compile error because x is immutable +``` + +### Mutable Variables + +```rust +let mut y = 5; +println!("The value of y is: {}", y); +y = 6; // This is allowed because y is mutable +println!("The value of y is: {}", y); +``` + +## Data Types + +Rust is a statically typed language, meaning all variable types must be known at compile time. The compiler usually infers types based on values and usage. Rust data types can be broadly divided into two categories: scalar and compound types. + +### Scalar Types + +Scalar types represent single values. As previously mentioned, Rust has four primary scalar types: integers, floating-point numbers, booleans, and characters. + +#### Integers + +Integers are numbers without fractional parts. In Rust, integer types are divided into signed and unsigned. For example, the `i32` type represents a signed 32-bit integer (`i` stands for `integer`). The `u` prefix indicates an unsigned type. Here are the built-in integer types available in Rust: + +| Length | Signed Type | Unsigned Type | +|:------------:|:-----------:|:-------------:| +| 8-bit | `i8` | `u8` | +| 16-bit | `i16` | `u16` | +| 32-bit | `i32` | `u32` | +| 64-bit | `i64` | `u64` | +| 128-bit | `i128` | `u128` | +| Architecture | `isize` | `usize` | + +For signed types, the numeric range is from `-(2^(n-1))` to `2^(n-1) - 1`, where `n` is the number of bits. For example, `i8` can store values from `-128` to `127`. Unsigned types range from `0` to `2^n - 1`, so `u8` ranges from `0` to `255`. + +The size of `isize` and `usize` depends on the architecture of the computer running the program: 32 bits for 32-bit CPUs and 64 bits for 64-bit CPUs. + +Integer literals can be represented in several ways: + +- Decimal: without a prefix, e.g., 98_222 (underscores improve readability) +- Hexadecimal: with a `0x` prefix, e.g., 0xff +- Octal: with a `0o` prefix, e.g., 0o77 +- Binary: with a `0b` prefix, e.g., 0b1111_0000 +- Byte (only for `u8` type): with a `b` prefix, e.g., b'A' + +```rust +let x: i32 = -123; +let y: u32 = 123; +println!("x is {}, y is {}", x, y); +``` + +#### Floating-Point Numbers + +Rust provides two floating-point types: single precision `f32` and double precision `f64`. By default, floating-point numbers are of type `f64` because it offers good precision and speed. + +| Type | Precision | +|:----:|:--------------------:| +| `f32`| Single precision (32-bit) | +| `f64`| Double precision (64-bit) | + +```rust +let x = 2.0; // No type specified, inferred as f64 (default) +let y: f32 = 3.0; // Explicitly specified as f32 +println!("x is {}, y is {}", x, y); + +let x1 = 2.0; // No type specified, but will be inferred as f32 because of the next statement +let y1: f32 = 3.0; // Explicitly specified as f32 +let z1 = x1 + y1; +println!("x1 is {}, y1 is {} z1 is {}", x1, y1, z1); +``` + +#### Booleans + +```rust +let t = true; +let f: bool = false; // Explicit type annotation +println!("t is {}, f is {}", t, f); +``` + +#### Characters + +Characters, encoded in Unicode, are 4 bytes in size in Rust: + +```rust +let c = 'z'; +let z = 'ℤ'; +let heart_eyed_cat = '😻'; +println!("c is {}, z is {}, heart_eyed_cat is {}", c, z, heart_eyed_cat); +println!("The character 'c' occupies {} bytes in memory", std::mem::size_of_val(&c)); +``` + +In Rust, the length of the `String` type depends on the encoding used. By default, Rust uses UTF-8 encoding, where each character occupies 1-4 bytes. The `char` type always occupies 4 bytes, even if some characters need only 1-3 bytes in specific encodings. The advantages are: +- Ensuring all `char` values occupy a fixed size in memory, aiding memory alignment and access efficiency. +- Avoiding the overhead of encoding conversion, directly using 4-byte values for efficient processing. +- Adequately representing all Unicode scalar values, ensuring future compatibility. + +### Compound Types + +Compound types can group multiple values into one type. Rust includes tuples and arrays as compound types. + +#### Tuples + +Tuples are a basic way to group multiple values of different types into one compound type with a fixed length. + +```rust +let tup: (i32, f64, u8, char) = (-500, 6.4, 1, 'z'); +let (w, x, y, z) = tup; // Destructuring the tuple +println!("The value of x is: {}", x); +``` + +#### Arrays + +Arrays group multiple values of the same type. Unlike tuples, arrays have a fixed length. + +```rust +let a = [1, 2, 3, 4, 5]; +let first = a[0]; +let second = a[1]; +println!("The first element is {}, the second element is {}", first, second); +``` + +## Summary + +In this chapter, we covered Rust's basic data types: the four basic scalar types (integers, floating-point numbers, booleans, and characters) and the two compound types (tuples and arrays). From 7ed3d0dc8b8b369451a8e8e9fec017af7b96d3eb Mon Sep 17 00:00:00 2001 From: Mosamorphing <121625762+Mosamorphing@users.noreply.github.com> Date: Fri, 19 Jul 2024 15:21:51 -0700 Subject: [PATCH 14/24] Create Cargo.toml --- Languages/en/02_BaseType/Cargo.toml | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 Languages/en/02_BaseType/Cargo.toml diff --git a/Languages/en/02_BaseType/Cargo.toml b/Languages/en/02_BaseType/Cargo.toml new file mode 100644 index 0000000..afd14bc --- /dev/null +++ b/Languages/en/02_BaseType/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "base_type" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] From 491f829318a4cdd6599797b4c9f9987711412054 Mon Sep 17 00:00:00 2001 From: Mosamorphing <121625762+Mosamorphing@users.noreply.github.com> Date: Fri, 19 Jul 2024 15:26:00 -0700 Subject: [PATCH 15/24] Create main.rs --- Languages/en/02_BaseType/src/main.rs | 36 ++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 Languages/en/02_BaseType/src/main.rs diff --git a/Languages/en/02_BaseType/src/main.rs b/Languages/en/02_BaseType/src/main.rs new file mode 100644 index 0000000..3db2e58 --- /dev/null +++ b/Languages/en/02_BaseType/src/main.rs @@ -0,0 +1,36 @@ +fn main() { +let x_immutable = 5; +println!("The value of x_immutable is: {}", x_immutable); +// x_immutable = 6; // This line will cause a compilation error because x_immutable is immutable + +let mut y_mutable = 5; +println!("The value of y_mutable is: {}", y_mutable); +y_mutable = 6; // This is allowed because y_mutable is mutable +println!("The value of y_mutable is: {}", y_mutable); + +let x_int_neg: i32 = -123; +let y_uint_pos: u32 = 123; +println!("x_int_neg is {}, y_uint_pos is {}", x_int_neg, y_uint_pos); + +let x_float64 = 2.0; // defaults to f64 +let y_float32: f32 = 3.0; // explicitly declared as f32 +println!("x_float64 is {}, y_float32 is {}", x_float64, y_float32); + +let t_bool = true; +let f_bool: bool = false; // explicit type declaration +println!("t_bool is {}, f_bool is {}", t_bool, f_bool); + +let c_char = 'z'; +let z_char = 'ℤ'; +let heart_eyed_cat_char = '😻'; +let z_string = String::from("string"); +println!("c_char is {}, z_char is {}, heart_eyed_cat_char is {}", c_char, z_char, heart_eyed_cat_char); +println!("The character 'c_char' occupies {} bytes of memory size", std::mem::size_of_val(&c_char)); +println!("The string 'z_string' content occupies {} bytes of memory size", &z_string.as_bytes().len()); + +let tup_var: (i32, f64, u8, char) = (-500, 6.4, 1, 'z'); +let (_w_from_tup, x_from_tup, _y_from_tup, _z_from_tup) = tup_var; // Deconstruct tuple +println!("The value of x_from_tup is: {}", x_from_tup); + +let a_array = [1, 2, 3, 4, 5]; +let first_element = a_array[0]; let second_element = a_array[1]; println!("The first element is {}, the second element is {}", first_element, second_element); } From 8d5a962730f9bcb8669f76b0cee16e3870f95588 Mon Sep 17 00:00:00 2001 From: Mosamorphing <121625762+Mosamorphing@users.noreply.github.com> Date: Fri, 19 Jul 2024 15:28:03 -0700 Subject: [PATCH 16/24] Create README.md --- Languages/en/03_CompoundType/README.md | 87 ++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 Languages/en/03_CompoundType/README.md diff --git a/Languages/en/03_CompoundType/README.md b/Languages/en/03_CompoundType/README.md new file mode 100644 index 0000000..5098f88 --- /dev/null +++ b/Languages/en/03_CompoundType/README.md @@ -0,0 +1,87 @@ +--- +title: 3. Compound Type +tags: +- Rust +- basic +- wtfacademy +--- + +# WTF Rust Minimalist Introduction: Compound Types Expanded: Tuples, Arrays, Strings, and Slices + +## Tuples + +A tuple is a compound type that can contain multiple values of different types with a fixed length. Once defined, the length of a tuple cannot grow or shrink, and indices start from 0. Tuples are very useful when you want to return multiple values from a function or group multiple values into a single collection. + +### Example Code + +```rust +fn main() { + let mixed = ("Rust", 2023, 3.14, true); + let (lang, year, pi, status) = mixed; + + println!("Language: {}, Year: {}, PI: {}, Status: {}", lang, year, pi, status); +} +``` + +## Dynamic Arrays (Vectors) + +Dynamic arrays, `Vec`, are flexible data structures that allow for resizing at runtime. This means their length can be changed dynamically to add or remove elements as needed. They are particularly useful for handling an uncertain number of data elements, such as reading an unknown number of user inputs or dynamically generating datasets. Dynamic arrays use a generic parameter `T`, meaning they can store values of **any type**, such as integers, characters, or floating-point numbers discussed earlier, but once the type is specified, all elements in the array must be of the **same type**. + +### Example Code + +```rust +fn main() { + // 1. Explicitly declare the type of the dynamic array + let mut v1: Vec = Vec::new(); + v1.push(1); + v1.push(2); + v1.push(3); + println!("vector v1: {:?}", &v1); + + // 2. Use the macro vec! to create an array with initial values + let v2 = vec![1u8, 2, 3]; + println!("vector v2: {:?}", &v2); +} +``` + +## Strings and Slices + +Strings are a very common compound type used to store text. In `Rust`, there are two main string types: `String` and string slices `&str`. + +### Creating and Using Strings + +```rust +fn main() { + let mut s = String::from("Hello"); // Mutable String type + s.push_str(", world!"); // Modify the String + println!("{}", s); + + let slice = &s[0..5]; // Get a slice of the String + println!("Slice: {}", slice); +} +``` + +A string slice `&str` is a reference to a `UTF-8` encoded string data stored somewhere (usually a `String` type) and is hardcoded into the program binary at compile time, making it immutable. Slices are particularly useful when you want to reference a portion of a `String` or pass a small amount of data. + +## Slices + +Slices allow you to reference a contiguous sequence of elements within a collection rather than the entire collection. They are also applicable to arrays. + +### Example Code + +```rust +fn main() { + let numbers = [1, 2, 3, 4, 5]; + let slice = &numbers[1..4]; // Reference a part of the array + + for &item in slice.iter() { + println!("{}", item); + } +} +``` + +Here, `slice` is a reference to a portion of the `numbers` array containing three elements. Slices are a very useful tool because they allow you to safely access a subset of elements from an array or string without copying them. + +## Summary + +By exploring tuples, arrays, strings, and slices, we gain a more comprehensive understanding of compound types in `Rust` and their advantages. These structures offer flexibility and efficiency in handling data and organizing program logic. Hopefully, these examples help you better understand these concepts and effectively use them in your `Rust` projects. From 5fafb477230b078a7d821bf70dce96ee4e67982d Mon Sep 17 00:00:00 2001 From: Mosamorphing <121625762+Mosamorphing@users.noreply.github.com> Date: Fri, 19 Jul 2024 15:29:42 -0700 Subject: [PATCH 17/24] Create main.rs --- Languages/en/03_CompoundType/src/main.rs | 38 ++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 Languages/en/03_CompoundType/src/main.rs diff --git a/Languages/en/03_CompoundType/src/main.rs b/Languages/en/03_CompoundType/src/main.rs new file mode 100644 index 0000000..37b6e13 --- /dev/null +++ b/Languages/en/03_CompoundType/src/main.rs @@ -0,0 +1,38 @@ +use itertools::Itertools; + +fn main() { + let mixed = ("Rust", 2023, 3.14, true); + let (lang, year, pi, status) = mixed; + + println!("Language: {}, Year: {}, PI: {}, Status: {}", lang, year, pi, status); + + + // 1. Explicitly declare the type of the dynamic array + let mut v1: Vec = Vec::new(); + v1.push(1); + v1.push(2); + v1.push(3); + println!("vector v1: {:?}", &v1); + + // 2. Use the macro vec! to create an array with initial values + let v2 = vec![1u8, 2, 3]; + println!("vector v2: {:?}", &v2); + + let mut s = String::from("Hello"); // Mutable String type + s.push_str(", world!"); // Modify the String + println!("{}", s); + + let slice = &s[0..5]; // Get a slice of the String; the first parameter is the start index (inclusive), the second parameter is the end index (exclusive) + println!("Slice: {}", slice); // Hello + + + let numbers = [1, 2, 3, 4, 5]; + // Add numbers 6 and 7 to the array numbers + + let slice = &numbers[0..2]; // Reference a part of the array + + for &item in slice.iter() { + println!("{}", item); + } + slice.iter().for_each(|&item| println!("{}", item)); +} From dc08ff3426c72f1604693b9ca7e0c6dd3dc359f2 Mon Sep 17 00:00:00 2001 From: Mosamorphing <121625762+Mosamorphing@users.noreply.github.com> Date: Fri, 19 Jul 2024 15:30:27 -0700 Subject: [PATCH 18/24] Create Cargo.toml --- Languages/en/03_CompoundType/Cargo.toml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 Languages/en/03_CompoundType/Cargo.toml diff --git a/Languages/en/03_CompoundType/Cargo.toml b/Languages/en/03_CompoundType/Cargo.toml new file mode 100644 index 0000000..32be50a --- /dev/null +++ b/Languages/en/03_CompoundType/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "compound_type" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +itertools = "0.10" From 166576f13ee38e4568ef63c85df6ed2e7162ca87 Mon Sep 17 00:00:00 2001 From: Mosamorphing <121625762+Mosamorphing@users.noreply.github.com> Date: Fri, 19 Jul 2024 15:31:51 -0700 Subject: [PATCH 19/24] Create Cargo.toml --- Languages/en/04_Struct_Enum/Cargo.toml | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 Languages/en/04_Struct_Enum/Cargo.toml diff --git a/Languages/en/04_Struct_Enum/Cargo.toml b/Languages/en/04_Struct_Enum/Cargo.toml new file mode 100644 index 0000000..b45f3b0 --- /dev/null +++ b/Languages/en/04_Struct_Enum/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "struct_enum" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] From 8f7d65bf8250027f8bb2a92c6181a225d6b1abaf Mon Sep 17 00:00:00 2001 From: Mosamorphing <121625762+Mosamorphing@users.noreply.github.com> Date: Fri, 19 Jul 2024 15:32:59 -0700 Subject: [PATCH 20/24] Create main.rs --- Languages/en/04_Struct_Enum/src/main.rs | 30 +++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 Languages/en/04_Struct_Enum/src/main.rs diff --git a/Languages/en/04_Struct_Enum/src/main.rs b/Languages/en/04_Struct_Enum/src/main.rs new file mode 100644 index 0000000..85bbc8c --- /dev/null +++ b/Languages/en/04_Struct_Enum/src/main.rs @@ -0,0 +1,30 @@ +// Define a Person struct +struct Person { + name: String, + age: u32, +} + +impl Person { + // Define a method to display personal information + fn show_info(&self) { + println!("{} is {} years old.", self.name, self.age); + } +} + +fn show_info() { + println!("this is a function"); +} + +fn main() { + // Create a Person instance with the name Alice and age 30 + let person1 = Person { + name: String::from("Alice"), + age: 30, + }; + + // Call the method to display personal information + person1.show_info(); + + // Call this function without needing an owner + show_info(); +} From 6521de38c00ad323cc9e5f2206291c7285660c63 Mon Sep 17 00:00:00 2001 From: Mosamorphing <121625762+Mosamorphing@users.noreply.github.com> Date: Fri, 19 Jul 2024 15:34:18 -0700 Subject: [PATCH 21/24] Create README.md --- Languages/en/04_Struct_Enum/README.md | 83 +++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 Languages/en/04_Struct_Enum/README.md diff --git a/Languages/en/04_Struct_Enum/README.md b/Languages/en/04_Struct_Enum/README.md new file mode 100644 index 0000000..e7608cc --- /dev/null +++ b/Languages/en/04_Struct_Enum/README.md @@ -0,0 +1,83 @@ +--- +title: 4. Structs and Enums +tags: +- Rust +- basic +- wtfacademy +--- + +# WTF Rust Minimalist Introduction: 4. Structs and Enums + +## 1. Defining and Using Structs + +First, let's talk about structs. A struct is like a custom data type used to represent entities in the real world, such as people, animals, or anything else we want to create. For example, to describe a person with attributes like age, name, and address, we can define a struct. It looks like this: + +```rust +// Define a Person struct +struct Person { + name: String, + age: u32, + address: String, +} + +fn main() { + // Create a Person instance with the name Alice and age 30 + let person1 = Person { + name: String::from("Alice"), + age: 30, + address: String::from("China"), + }; + + // Output the information of this Person instance + println!("{} is {} years old.", person1.name, person1.age); +} +``` + +## 2. Method Definitions + +Now, let's discuss methods, which are functions associated with structs. The difference between a `method` and a `function` is that a `method` has an **owner**, with its first parameter typically being `&self`, indicating the owner. When calling a method, you must specify the owner, like `owner.method()`. In contrast, a `function` has no owner and is considered a public function. The same program cannot have two functions with the same signature. Methods, having owners, allow different owners to have methods with the same signature. By using methods, we can provide behavior for structs. It sounds advanced but is actually simple: + +```rust +impl Person { + // Define a method to display personal information + fn show_info(&self) { + println!("{} is {} years old.", self.name, self.age); + } +} + +fn main() { + let person1 = Person { + name: String::from("Bob"), + age: 25, + }; + + // Call this method to display personal information + person1.show_info(); +} +``` + +## 3. Enums and Pattern Matching + +Next, let's talk about enums and pattern matching. Enums allow us to define various possible data variants, and then handle these variants through pattern matching. It sounds complex but is quite interesting: + +```rust +// Define an enum to represent different colors +enum Color { + Red, + Green, + Blue, +} + +fn main() { + let color = Color::Blue; + + // Use pattern matching to handle different colors + match color { + Color::Red => println!("The color is Red"), + Color::Green => println!("The color is Green"), + Color::Blue => println!("The color is Blue"), + } +} +``` + +By using structs and enums, we can better organize and manage data, and pattern matching allows us to handle data more flexibly. I hope this chapter helps you gain a clear understanding of structs and enums! From 5778e36ba2baba61aa9db8deb85d6f0f01b28e2b Mon Sep 17 00:00:00 2001 From: Mosamorphing <121625762+Mosamorphing@users.noreply.github.com> Date: Fri, 19 Jul 2024 15:35:45 -0700 Subject: [PATCH 22/24] Create README.md --- Languages/en/05_Ownership/README.md | 81 +++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 Languages/en/05_Ownership/README.md diff --git a/Languages/en/05_Ownership/README.md b/Languages/en/05_Ownership/README.md new file mode 100644 index 0000000..d89e419 --- /dev/null +++ b/Languages/en/05_Ownership/README.md @@ -0,0 +1,81 @@ +--- +title: 5. Ownership +tags: + - Rust + - basic + - wtfacademy +--- + +# WTF Rust Minimalist Introduction: Ownership, Borrowing, and References +This chapter covers the essence of `Rust`: ownership, borrowing, and references. These concepts are the foundation of `Rust`'s memory safety, helping developers write safe and efficient code while avoiding common errors found in traditional languages, such as null pointer access and data races. + +## 1. Ownership Rules + +In `Rust`, the core rules of the ownership system can be summarized as follows: + +- Every value has a single owner variable. +- A value can only have one owner at a time. +- When the owner goes out of scope, the value is dropped. + +These rules ensure memory safety and prevent leaks while avoiding manual memory management. + +### Example: Ownership Transfer + +```rust +fn main() { + let s1 = String::from("hello"); // s1 is the owner of the "hello" object + + let s2 = s1; // Ownership is transferred from s1 to s2; s1 becomes unusable + // println!("{s1}"); // Error: s1 no longer holds the string + + display(s2); // s2 transfers ownership to the function parameter s; s2 becomes unusable + // println!("{s2}"); // Error: s2 is no longer usable +} + +fn display(s: String) { + println!("{:?}", s); +} +``` + +## 2. Borrowing + +In `Rust`, borrowing refers to obtaining **access rights** to data via references, rather than **ownership**, denoted by the `&` symbol. Borrowing allows multiple parts of code to access the same data simultaneously without transferring ownership. Borrowing comes in two forms: immutable borrowing and mutable borrowing. + +- **Immutable Borrowing**: Allows multiple borrows, but the data cannot be modified during the borrowing period; `Rust` defaults to immutable borrowing. +- **Mutable Borrowing**: Allows data modification, but only one mutable borrow is allowed at a time. + +### Example: Immutable Borrowing + +```rust +fn main() { + let s1 = String::from("hello"); + let len = calculate_length(&s1); // s1 is immutably borrowed; the function can only read but not modify s1 + + println!("The length of '{}' is {}.", s1, len); +} + +fn calculate_length(s: &String) -> usize { // s is a reference to s1 + s.len() +} +``` + +### Example: Mutable Borrowing + +```rust +fn main() { + let mut s = String::from("hello"); + + change(&mut s); // s is mutably borrowed; the function can modify s + + println!("{}", s); +} + +fn change(some_string: &mut String) -> &mut String { + some_string.push_str(", wtf!"); + some_string +} +``` + +## Summary + +Through these examples, you should have a basic understanding of `Rust`'s core concepts: ownership and borrowing. Mastering these concepts is crucial for effectively utilizing `Rust`'s features, enabling you to write safer and more efficient code. If you have any questions or need further clarification, feel free to ask! From e28222492ec59d609349e8b077d0c9d74b3a46d8 Mon Sep 17 00:00:00 2001 From: Mosamorphing <121625762+Mosamorphing@users.noreply.github.com> Date: Fri, 19 Jul 2024 15:36:16 -0700 Subject: [PATCH 23/24] Create Cargo.toml --- Languages/en/05_Ownership/Cargo.toml | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 Languages/en/05_Ownership/Cargo.toml diff --git a/Languages/en/05_Ownership/Cargo.toml b/Languages/en/05_Ownership/Cargo.toml new file mode 100644 index 0000000..ac44089 --- /dev/null +++ b/Languages/en/05_Ownership/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "Ownership" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] From c5c18f3d44105685f39e2e346cb6844b5305f3d1 Mon Sep 17 00:00:00 2001 From: Mosamorphing <121625762+Mosamorphing@users.noreply.github.com> Date: Fri, 19 Jul 2024 15:37:35 -0700 Subject: [PATCH 24/24] Create main.rs --- Languages/en/05_Ownership/src/main.rs | 34 +++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 Languages/en/05_Ownership/src/main.rs diff --git a/Languages/en/05_Ownership/src/main.rs b/Languages/en/05_Ownership/src/main.rs new file mode 100644 index 0000000..a6673b2 --- /dev/null +++ b/Languages/en/05_Ownership/src/main.rs @@ -0,0 +1,34 @@ +fn display(s: String) { + println!("{:?}", s); +} + +fn calculate_length(s: &String) -> usize { + // s is a reference to s1 + s.len() +} + +fn change(some_string: &mut String) -> &mut String { + some_string.push_str(", wtf!"); + some_string +} + +fn main() { + let mut s1 = String::from("hello"); // s1 is the owner of the "hello" object + s1.push_str(", wtf!"); // s1 can modify the "hello" object by appending a string + + let s2 = s1; // Ownership is transferred from s1 to s2 + // println!("{s1}"); // Error: s1 no longer owns the string + + display(s2); // s2 transfers ownership to the function parameter s; s2 becomes unusable + // println!("{s2}"); // Error: s2 is no longer usable + + // Immutable Borrowing + let s3 = String::from("hello"); + let len = calculate_length(&s3); // s3 is immutably borrowed; the function can only read but not modify s3 + println!("The length of '{}' is {}.", s3, len); + + // Mutable Borrowing + let mut s4 = String::from("hello"); + change(&mut s4); // s4 is mutably borrowed; the function can modify s4 + println!("{}", s4); +}