rust
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| rust [2024/07/10 19:16] – [Debug attribute and println!] utedass | rust [2024/07/11 20:46] (current) – [Matching] utedass | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== Rust ====== | ====== Rust ====== | ||
| + | |||
| + | ==== Variables ==== | ||
| + | |||
| + | <code rust> | ||
| + | fn main() { | ||
| + | let x = 5; // Immutable i32 (default) | ||
| + | |||
| + | let mut y = 5.0; // Mutable f32 (default) | ||
| + | y += 1; | ||
| + | |||
| + | let y = 6; // Shadowing is fine | ||
| + | |||
| + | // Constants need explicit type | ||
| + | const THREE_HOURS_IN_SECONDS: | ||
| + | |||
| + | let f: bool = false; // Boolean | ||
| + | let c: char = ' | ||
| + | let tup: (i32, f64, u8) = (500, 6.4, 1); // Tuple | ||
| + | let a: [i32; 5] = [1, 2, 3, 4, 5]; // Array | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ==== Control flow ==== | ||
| + | |||
| + | <code rust> | ||
| + | |||
| + | if number < 5 { | ||
| + | println!(" | ||
| + | } else if number % 3 == 0 { | ||
| + | println!(" | ||
| + | } else { | ||
| + | println!(" | ||
| + | } | ||
| + | |||
| + | </ | ||
| + | |||
| + | |||
| + | <code rust> | ||
| + | let mut count = 0; | ||
| + | ' | ||
| + | println!(" | ||
| + | let mut remaining = 10; | ||
| + | |||
| + | loop { | ||
| + | println!(" | ||
| + | if remaining == 9 { | ||
| + | break; | ||
| + | } | ||
| + | if count == 2 { | ||
| + | break ' | ||
| + | } | ||
| + | remaining -= 1; | ||
| + | } | ||
| + | |||
| + | count += 1; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | <code rust> | ||
| + | while number != 0 { | ||
| + | println!(" | ||
| + | |||
| + | number -= 1; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | <code rust> | ||
| + | let a = [10, 20, 30, 40, 50]; | ||
| + | |||
| + | for element in a { | ||
| + | println!(" | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ==== References and Borrowing ==== | ||
| + | <code rust> | ||
| + | let mut x: Box< | ||
| + | let a: i32 = *x; // *x reads the heap value, so a = 1 | ||
| + | *x += 1; // *x on the left-side modifies the heap value, | ||
| + | // | ||
| + | |||
| + | let r1: & | ||
| + | let b: i32 = **r1; // two dereferences get us to the heap value | ||
| + | |||
| + | let r2: &i32 = & | ||
| + | let c: i32 = *r2; // so only one dereference is needed to read it | ||
| + | |||
| + | // Mutable reference | ||
| + | let mut v: Vec< | ||
| + | let num: &mut i32 = &mut v[2]; | ||
| + | *num += 1; | ||
| + | </ | ||
| + | ==== Struct methods ==== | ||
| + | |||
| + | Functions in a struct that have '' | ||
| + | |||
| + | Associated functions that don't have '' | ||
| + | |||
| + | <code rust> | ||
| + | struct Rectangle { | ||
| + | width: u32, | ||
| + | height: u32, | ||
| + | } | ||
| + | |||
| + | impl Rectangle { | ||
| + | fn area(& | ||
| + | self.width * self.height | ||
| + | } | ||
| + | |||
| + | fn can_hold(& | ||
| + | self.width > other.width && self.height > other.height | ||
| + | } | ||
| + | |||
| + | fn square(size: | ||
| + | Self { | ||
| + | width: size, | ||
| + | height: size, | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | |||
| + | fn main() { | ||
| + | let a : Rectangle:: | ||
| + | let b : Rectangle { | ||
| + | width: 1, | ||
| + | height: 2, | ||
| + | } | ||
| + | |||
| + | println!(" | ||
| + | } | ||
| + | </ | ||
| ==== Debug attribute and println! ==== | ==== Debug attribute and println! ==== | ||
| Line 40: | Line 171: | ||
| dbg!(& | dbg!(& | ||
| } | } | ||
| + | </ | ||
| + | |||
| + | ==== Enums ==== | ||
| + | <code rust> | ||
| + | enum IpAddrKind { | ||
| + | V4, | ||
| + | V6, | ||
| + | } | ||
| + | |||
| + | fn main() { | ||
| + | let four = IpAddrKind:: | ||
| + | let six: IpAddrKind = IpAddrKind:: | ||
| + | } | ||
| + | </ | ||
| + | Enums can have different content for their different enumerations. | ||
| + | <code rust> | ||
| + | enum Message { | ||
| + | Quit, | ||
| + | Move { x: i32, y: i32 }, | ||
| + | Write(String), | ||
| + | ChangeColor(i32, | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | They can also have functions | ||
| + | <code rust> | ||
| + | enum Message { | ||
| + | Quit, | ||
| + | Move { x: i32, y: i32 }, | ||
| + | Write(String), | ||
| + | ChangeColor(i32, | ||
| + | } | ||
| + | |||
| + | impl Message { | ||
| + | fn call(& | ||
| + | // method body would be defined here | ||
| + | } | ||
| + | } | ||
| + | |||
| + | let m = Message:: | ||
| + | m.call(); | ||
| + | </ | ||
| + | |||
| + | There is the special Option type available in the standard library std:: | ||
| + | <code rust> | ||
| + | enum Option< | ||
| + | None, | ||
| + | Some(T), | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | <code rust> | ||
| + | let some_number = Some(5); | ||
| + | let some_char = Some(' | ||
| + | |||
| + | let absent_number: | ||
| + | </ | ||
| + | |||
| + | ==== Matching ==== | ||
| + | <code rust> | ||
| + | enum UsState { | ||
| + | Alabama, | ||
| + | Alaska, | ||
| + | // --snip-- | ||
| + | } | ||
| + | |||
| + | enum Coin { | ||
| + | Penny, | ||
| + | Nickel, | ||
| + | Dime, | ||
| + | Quarter(UsState), | ||
| + | } | ||
| + | |||
| + | fn value_in_cents(coin: | ||
| + | match coin { | ||
| + | Coin::Penny => 1, | ||
| + | Coin:: | ||
| + | Coin::Dime => 10, | ||
| + | Coin:: | ||
| + | println!(" | ||
| + | 25 | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Can match integers as well | ||
| + | <code rust> | ||
| + | let dice_roll = 9; | ||
| + | match dice_roll { | ||
| + | 3 => add_fancy_hat(), | ||
| + | 7 => remove_fancy_hat(), | ||
| + | other => move_player(other), | ||
| + | } | ||
| + | |||
| + | fn add_fancy_hat() {} | ||
| + | fn remove_fancy_hat() {} | ||
| + | fn move_player(num_spaces: | ||
| </ | </ | ||
rust.1720639006.txt.gz · Last modified: 2024/07/10 19:16 by utedass
