Rust圣经

17 次浏览
2024年08月05日创建

表达式

let y = {
        let x = 3;
        x + 1
    };

永不返回函数

fn dead_end() -> ! {
  panic!("你已经到了穷途末路,崩溃吧!");
}
或者
fn forever() -> ! {
  loop {
    //...
  };
}

可变引用 &mut T 是不可以 Copy的。

&String可以转&str,但是&str不可以转String,toString可以。

元组可以解构

let tup = (500, 6.4, 1);

let (x, y, z) = tup;

结构体也可以解构

struct Point {
    x: i32,
    y: i32,
}

fn main() {
    let p = Point { x: 0, y: 7 };

    let Point { x, y } = p;
    assert_eq!(0, x);
    assert_eq!(7, y);
}

if let与while let产生的变量遮蔽。

可以为枚举定义方法:

#![allow(unused)]
enum Message {
    Quit,
    Move { x: i32, y: i32 },
    Write(String),
    ChangeColor(i32, i32, i32),
}

impl Message {
    fn call(&self) {
        // 在这里定义方法体
    }
}

fn main() {
    let m = Message::Write(String::from("hello"));
    m.call();
}

一段很奇怪的代码:

fn main() {
    let i = vec![32,44,55,1];
    println!("{}", largest_1(&i));
}

pub fn largest<T: PartialOrd + Copy>(list: &[T]) -> T{
    let mut largest = list[0];
    for item in list.iter() {
        if *item > largest {
            largest = *item;
        }
    }
    largest
}

pub fn largest_1<T: PartialOrd + Copy>(list: &[T]) -> T{
    let mut largest = list[0];
    for item in list.iter() {
        if *item > largest {
            largest = *item;
        }
    }
    largest
}

下面的方式都可以:

pub fn print(item: impl Summary){
    item.draw();
}

fn draw2(x: &dyn Summary) {
    x.draw();
}

fn draw3(x: Box<dyn Summary>) {
    x.draw();
}