Ржавчина начинается с 0️⃣ (2)

задняя часть Rust
Ржавчина начинается с 0️⃣ (2)

Базовая грамматика 2

Поскольку грамматика ржавчины сильно отличается от большинства языковых грамматик, изучайте грамматику медленно.

Юаньцзу

  • tuple
    • Если так написаноlet aa = (1i32,true);
    • представляет собой первыйi32тип, второй имеет тип bool
    • Посмотрите на код ниже
fn main() {
    let p = (1i32, 2i32);
    let (a , b) = p;
    let x = p.0;
    let y = p.1;

    // 输出 1 2 1 2
    println!("{} {} {} {}",a,b,x,y);
}
  • вa,bпредназначен для использованиясопоставление с образцом
    • а такжеx,yпредназначен для использованиячисловой индекс

перечислить

  • Обычно читайте перечисление, будет использоватьсопоставление с образцом
use std::num::NonZeroU8;

enum Number {
    Int(i32),
    Float(f32)
}

fn input_num(num : &Number) {
    match num {
        &Number::Int(v) => println!("Integer {}",v),
        &Number::Float(v) => println!("Float {}",v),
    }
}

fn main() {

    let n : Number = Number::Int(100);
    // 输出 Integer 100
    input_num(&n);
}

основные арифметические выражения

fn main() {

    let x = 100;
    let y = 10;
    // 110 90 1000 10 0
    println!("{} {} {} {} {}", x + y, x - y, x * y, x / y, x % y);
}

Небольшие правила кода

  • Если есть суждение о непрерывном равенстве, необходимо добавить скобки по семантике.
    • Если код ниже,a==b==cБез скобок компилятор сообщит об ошибке
fn calculate(a: bool,b: bool,c: bool) -> bool {
    (a == b) == c
}

fn main() {

    // true
    println!("{}",calculate(false,true,false));
}

if-else

fn func(i: i32) {
    if i > 10 && i < 20 {
        print!("i > 10");
    }else if i > 20 && i < 30 {
        print!("i > 20")
    }else {
        print!("i > 30")
    }
}

fn main() {
    // i > 30
    func(40);
}

функция

fn add(t : (i32,i32)) -> i32 {
    t.0 + t.1
}

fn main() {
    //输出 3
    println!("{}",add((1,2)))
}
  • Вариант вышеуказанной функции
fn add((x,y) : (i32,i32)) -> i32 {
    x + y
}

fn main() {
    //输出 3
    println!("{}",add((1,2)))
}
  • Когда преобразование типа встречается с функцией
    • add1 должен передать параметр
    • И add2 должен передать кортеж, дваi32переменная типа
    • Следующий код эквивалентенfuncпреобразование типов
fn add1(t : (i32,i32)) -> i32 {
    t.0 + t.1
}

fn add2((x,y) : (i32,i32)) -> i32 {
    x + y
}

fn add3(x: i32,y: i32) -> i32 {
    x + y
}

fn main() {
    let mut func : fn((i32,i32)) -> i32 = add1;
    func = add2;
    //输出 7
    println!("{}",func((2,5)))
}

Функция условного суждения

fn check(x : bool) -> i32 {
    let p = if x {
        panic!("Error!");
    } else {
        7
    };
    return p;
}

fn main() {
    let func = check(false);
    //输出 7
    println!("{}",func)
}

Рекурсивный Фибоначчи

fn fib(i : u32) -> u64 {
    if i == 1 || i == 2 {
        return 1
    } else {
     return fib(i - 1) + fib(i - 2);
    }
}

fn main() {
    let c = fib(10);
    //输出 55
    println!("{}",c)
}

trait

trait Shape {
    fn area(self: &Self) -> f64;
}

struct Circle {
    r: f64,
}

impl Shape for Circle {
    fn area(self: &Self) -> f64 {
        std::f64::consts::PI * self.r * self.r
    }
}


fn main() {
    let c = Circle {r : 3f64};
    //输出 圆的面积为 28.274333882308138
    println!("圆的面积为 {}",c.area())
}
  • Это видно из приведенного выше кода
    • если естьCircleэкземпляр типа c, мы можем вызвать внутреннийc.area()
    • в состоянии пройтиself.rдля доступа к внутренним членам