美文网首页
vector, 哈希与错误的基本操作

vector, 哈希与错误的基本操作

作者: 简书网abc | 来源:发表于2021-08-24 21:45 被阅读0次

    1, vector的基本操作

    fn main() {
        //新建vector
        let mut v = Vec::new();
        v.push(1);
        v.push(2);
        println!("vec = {:?}", v);
    
        //读取 vector 的元素
        //索引语法或者 get 方法
        let mut v = vec![1, 2, 3, 4, 5];
        let third = &v[2];
        println!("the third ele is {}", third);
        v.push(6);  // 在前面发生借用的情况下,这个仍然可以修改
        match v.get(5) {
            Some(third) => {
                println!("The six ele is {}", third)
            },
            None => {
                println!("There is no six ele")
            }
        }
    
        //遍历不可变 vector 中的元素
        let v = vec![100, 23, 234, 33];
        for i in &v {
            println!("{} ", i);
        }
    
        //遍历 可变 vector 中的元素, 并且修改其中的值
        let mut v = vec![100, 300 ,400];
        for i in &mut v {
            *i += 50;
        }
        println!("可变vec修改后: {:?}", v);
    
        //使用枚举来储存多种类型
        enum SpreadsheetCell {
            Int(i32),
            Float(f64),
            Text(String),
        }
        let row = vec![
            SpreadsheetCell::Int(34),
            SpreadsheetCell::Float(12.32),
            SpreadsheetCell::Text("red".to_string()),
        ];
        let one = &row[0];  // 枚举不能够移动, 只能够引用
        match one {            //读取枚举的值
            SpreadsheetCell::Int(i) => {
                println!("int is {}", i)
            },
            SpreadsheetCell::Float(f) => {
                println!("float is {}", f);
            },
            SpreadsheetCell::Text(t) => {
                println!("t is {}", t);
            }
        }
    }
    
    

    2,哈希 map基本操作

    fn main() {
        //新建一个哈希 map
        use std::collections::HashMap;
    
        let mut scores = HashMap::new();
        scores.insert(String::from("blue"), 10);
        scores.insert(String::from("yellow"), 40);
        println!("1, hash map : {:?}", scores);
    
        //另一个构建哈希 map 的方法是使用一个元组的 vector 的 collect 方法
        let teams = vec![String::from("red"), String::from("black")];
        let initial_scores = vec![10, 30];
        let scores : HashMap<_, _> = teams.iter().zip(initial_scores.iter()).collect();
        println!("2, hash map : {:?}", scores);
    
        //哈希 map 和所有权
        //对于像 i32 这样的实现了 Copy trait 的类型,其值可以拷贝进哈希 map。
        //对于像 String 这样拥有所有权的值,其值将被移动而哈希 map 会成为这些值的所有者,
        let field_name = String::from("Favorite color");
        let field_value = String::from("Blue");
        let mut map = HashMap::new();
        map.insert(field_name, field_value);
        println!("3, hash map : {:#?}", map);
        // 这里 field_name 和 field_value 不再有效,
        // 尝试使用它们看看会出现什么编译错误!
    
        //访问哈希 map 中的值
        let team_name = String::from("Favorite color");
        let score = map.get(&team_name);
        match score {
            Some(name) => {
                println!("访问hash中的变量: {}", name);
            },
            None => {
                println!("score is nothing");
            }
        }
        if let Option::Some(name) = score {
            println!("第二种: 访问hash中的变量: {}", name);
        }
    
        //遍历哈希 map 中的每一个键值对, 这会以任意顺序打印出每一个键值对
        let mut scores = HashMap::new();
        scores.insert(String::from("Blue"), 10);
        scores.insert(String::from("Yellow"), 50);
        for (key, value) in &scores {
            println!("遍历: {}: {}", key, value);
        }
    
        //覆盖一个值
        let mut scores = HashMap::new();
        scores.insert(String::from("Blue"), 10);
        scores.insert(String::from("Blue"), 25);
        println!("覆盖 : {:?}", scores);
    
        //只在键没有对应值时插入
        let mut scores = HashMap::new();
        scores.insert(String::from("Blue"), 10);
    
        scores.entry(String::from("Yellow")).or_insert(50);
        scores.entry(String::from("Blue")).or_insert(50);
    
        println!("键没有对应值时插入: {:?}", scores);
    
        //根据旧值更新一个值
        let text = "hello world wonderful world";
        let mut map = HashMap::new();
        for word in text.split_whitespace() {            //分割字符串
            let count = map.entry(word).or_insert(0);   // 没有键的时候插入为0
            *count += 1;                                 // 增加1
        }
        println!("根据旧值更新一个值 : {:?}", map);
    
    }
    

    3,错误操作

    fn f(i: i32) -> Result<i32, bool> {
        if i >= 0 {
            Result::Ok(i)
        } else {
            Result::Err(false)
        }
    }
    
    fn g(i: i32) -> Result<i32, bool> {
        let t = f(i)?;  // Rust 中可以在 Result 对象后添加 ? 操作符将同类的 Err 直接传递出去:
        Ok(t) // 因为确定 t 不是 Err, t 在这里已经是 i32 类型
    }
    
    fn main() {
        let r = g(10000);
        if let Ok(v) = r {
            println!("Ok: g(10000) = {}", v);
        } else {
            println!("Err");
        }
        let a = Option::Some(1);
        if let Option::Some(a) = a {
            println!("a = {}", a);
        } else {
            println!("no record");
        }
    }
    
    // 获取错误的类型
    use std::io;
    use std::io::Read;
    use std::fs::File;
    
    fn read_text_from_file(path: &str) -> Result<String, io::Error> {
        let mut f = File::open(path)?;     // ?有错误直接返回
        let mut s = String::new();
        f.read_to_string(&mut s)?;     // ?有错误直接返回
        Ok(s)
    }
    
    fn main() {
        let str_file = read_text_from_file("hello.txt");
        match str_file {
            Ok(s) => println!("{}", s),
            Err(e) => {
                match e.kind() {        // 判断 Result 的 Err 类型,获取 Err 类型的函数是 kind()。
                    io::ErrorKind::NotFound => {
                        println!("No such file");
                    },
                    _ => {
                        println!("Cannot read the file");
                    }
                }
            }
        }
    }
    
    // 简介的写法
    use std::io;
    use std::io::Read;
    use std::fs::File;
    
    fn read_username_from_file() -> Result<String, io::Error> {
        let mut s = String::new();
        File::open("hello.txt")?.read_to_string(&mut s)?;  // ?有错误直接返回
        Ok(s)
    }
    
    fn main() {
        match read_username_from_file() {
            Ok(s) => {
                println!("s = {}", s);
            },
            Result::Err(e) => {
                println!("error: {}", e.to_string());
            }
        }
    }
    
    // 传播错误
    use std::io;
    use std::io::Read;
    use std::fs::File;
    
    fn read_username_from_file() -> Result<String, io::Error> {
        let f : io::Result<File> = File::open("hello.txt");
    
        let mut f : File = match f {    // 从Result中取到File类型再赋值给f变量
            Ok(file) => file,
            Err(e) => return Err(e),
        };
    
        let mut s = String::new();
    
        match f.read_to_string(&mut s) {
            Ok(_) => Ok(s),
            Err(e) => Err(e),
        }
    }
    
    fn main() {
        match read_username_from_file() {
            Ok(s) => {
                println!("s = {}", s);
            },
            Result::Err(e) => {
                println!("error: {}", e.to_string());
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:vector, 哈希与错误的基本操作

          本文链接:https://www.haomeiwen.com/subject/illjiltx.html