rust练习笔记1


去掉未使用变量的warning

fn main() {
    let _x = 1;
}

#[allow(unused_variables)]
fn main() {
    let x = 1;
}

打印变量类型


// 解决代码中的错误和 `panic`
fn main() {
   let v1 = 251_u16 + 8;
   let v2 = 0.1+0.2;
   println!("{}",type_of(&v1)); //u16
   println!("{}",type_of(&v2)); //f64
   let v2 = u16::checked_add(251, 8).unwrap(); 
   // unwrap表示给我计算结果,如果有问题,panic
   println!("{},{}",v1,v2);
}

fn type_of<T>(_: &T) -> String {
    format!("{}",std::any::type_name::<T>())
}

浮点数判断相等

fn main() {
    //assert!(0.1+0.2==0.3);
    assert!((0.1_f32+0.2-0.3).abs()<0.01);
    // abs()不能是不明确的float
}

类型转换

fn main() {
    let mut sum = 0;
    for i in -3..2 {
        sum += i
    }

    assert!(sum == -5);

    for c in 'a'..='z' {
        println!("{}",c as u8); // 97 98...
    }
}

空()

// 让代码工作:修改 `assert!` 中的 `4` 
use std::mem::size_of_val;
fn main() {
    let unit: () = ();
    assert!(size_of_val(&unit) == 0);
    // unit type doesn't occupy any memory space
    println!("Success!")
}

发散函数

待续。

second borrow

// 注释掉一行代码让它工作
fn main() {
    let mut s = String::from("hello, ");

    let r1 = &mut s;
    r1.push_str("world");
    let r2 = &mut s;
    r2.push_str("!");

    //println!("{}",r1); // error
    // 因为此时r1还被使用就有了二次引用
    println!("{}",r2);
}

from into

demo:

use std::convert::From;

#[derive(Debug)]
struct Number {
    value: i32,
}

impl From<i32> for Number {
    fn from(item: i32) -> Self {
        Number { value: item }
    }
}

fn main() {
    let int = 5;
    // 试试删除类型说明
    let num: Number = int.into();
    println!("My number is {:?}", num);
}

String依次打印

fn main() {
    // 填空,打印出 "你好,世界" 中的每一个字符
    for c in "你好,世界".chars() {
        println!("{}", c)
    }
}

String无法通过索引访问某个字符

无法通过索引的方式去访问字符串中的某个字符,但是可以使用切片的方式 &s1[start..end] ,但是start 和 end 必须准确落在字符的边界处.