Skip to content

Latest commit

 

History

History
113 lines (88 loc) · 2.64 KB

01.入门.md

File metadata and controls

113 lines (88 loc) · 2.64 KB

01 入门

变量与常量的区别

  1. 不允许对常量使用 mut。
  2. 常量使用 const 关键字,并且需要注明类型。
  3. 常量只能被设置为常量表达式,不能是函数调用的结果,或者是任何其它只能在运行时计算出的值。
  4. 在声明它的作用域中,常量在整个程序生命周期都有效。

mut 与 &mut

① mut 修饰变量,表示这个变量可以被重新绑定, 或者再次被 mut 或 &mut 修饰。 ② &mut 修饰引用,表示它指向的对象可以被修改。

fn main() {
    let mut var = 0_i32;
    // 修饰引用
    {
        let p1 = &mut var;
        *p1 = 1;
    }
    // 修饰变量
    {
        let mut p2 = &var;
        let temp = 2_i32;
        p2 = &temp;
    }
    // 左边修饰变量,右边修饰引用
    {
        let mut p3 = &mut var;
        let mut temp = 3_i32;
        *p3 = 3;
        p3 = &mut temp;
    }
}

打印语句

一、实现 DisplayDebug

#[derive(Debug)]
struct A {
    name: String,
}

impl Display for A {
    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
        write!(f, "{}", self.name)
    }
}

fn main() {
    println!("Hello, world!");
    let a = A {
        name: String::from("hello")
    };
    println!("{:?}", a);
}

注:

  1. 泛型容器(如 Vec<T>)不会实现 Display,而是去实现 Debug。因为无法得知 T 是什么类型,所以无法实现一个通用的 Display。
  2. 实现 Display trait,则自动实现 ToString 这个 trait。

二、为一个集合类型实现 Display

struct List(Vec<i32>);

impl fmt::Display for List {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        // Extract the value using tuple indexing,
        // and create a reference to `vec`.
        let vec = &self.0;

        write!(f, "[")?;

        // Iterate over `v` in `vec` while enumerating the iteration
        // count in `count`.
        for (count, v) in vec.iter().enumerate() {
            // For every element except the first, add a comma.
            // Use the ? operator to return on errors.
            if count != 0 { write!(f, ", ")?; }
            write!(f, "{}", v)?;
        }

        // Close the opened bracket and return a fmt::Result value.
        write!(f, "]")
    }
}

fn main() {
    let v = List(vec![1, 2, 3]);
    println!("{}", v);
}

注:
tuple struct 与 type 别名两者区别?

struct List(Vec<i32>);

type List = Vec<i32>;

前者是一个新类型;后者只是一个语法糖,可以随时用 Vec<i32> 将其替换,故而在此无法用它实现 Display trait,因为 rust 的限制。