Rust从1.13版对语言进行了一些扩展,包括期待已久的?操作符。今天重点来谈谈?操作符。

最初,加入了一个新的操作符?,是为了简化Result

fn read_username_from_file() -> Result<String, io::Error> {let f = File::open("username.txt");let mut f = match 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 read_username_from_file() -> Result<String, io::Error> {//对象本身返回类型就是Result; 且在Result类函数体内let mut f = File::open("username.txt")?; let mut s = String::new();f.read_to_string(&mut s)?;Ok(s)
}
use std::fs::File;
use std::io::prelude::*;
use std::io;struct Info {name: String,age: i32,rating: i32,
}fn write_info(info: &Info) -> io::Result<()> {// Early return on errorlet mut file = match File::create("my_best_friends.txt") {Err(e) => return Err(e),Ok(f) => f,};if let Err(e) = file.write_all(format!("name: {}\n", info.name).as_bytes()) {return Err(e)}if let Err(e) = file.write_all(format!("age: {}\n", info.age).as_bytes()) {return Err(e)}if let Err(e) = file.write_all(format!("rating: {}\n", info.rating).as_bytes()) {return Err(e)}Ok(())
}

有了?操作符,可以改成下面:

use std::fs::File;
use std::io::prelude::*;
use std::io;struct Info {name: String,age: i32,rating: i32,
}fn write_info(info: &Info) -> io::Result<()> {let mut file = File::create("my_best_friends.txt")?;// Early return on errorfile.write_all(format!("name: {}\n", info.name).as_bytes())?;file.write_all(format!("age: {}\n", info.age).as_bytes())?;file.write_all(format!("rating: {}\n", info.rating).as_bytes())?;Ok(())
}

细查一下write_all:

use std::io;trait Write {fn write_all(&mut self, bytes: &[u8]) -> Result<(), io::Error>;
}

还有:File::create

pub fn create<P: AsRef<Path>>(path: P) -> Result<File>

感觉幸福了不少。

注意:test_io函数体中的内容不能直接放到main函数中。因为不符合我们前面提的几个条件,main函数的返回为(),不是Result或Option类型,或实现了Try trait。

use std::fs::File;
use std::io::prelude::*;
fn main() {let st = SystemTime::now();println!("i will go asleep!");test_io("C:\\Users\\wowotuo\\Desktop\\test.txt");let et =SystemTime::now();    thread::sleep_ms(500000);}fn test_io(s:&str)->io::Result<()>{let mut f = File::create(s)?;f.write_all(b"Hello, world!")?;f.sync_data()?;Ok(())
}

二、发展至Option

从1.22版本开始,为了简化Option类型的处理,最新版本的Rust允许在Option类型上使用?操作符了。

Rust : ? 操作符(待续)相关推荐

  1. 转: Oracle 索引详解

    一. 索引介绍 1.1 索引的创建语法          CREATE UNIUQE | BITMAP INDEX <schema>.<index_name>          ...

  2. Rust:用问号 ?操作符简化错误信息的判断

    Option 返回值 如果你调用的函数和你正在写的函数都返回 Option 类型,如果你调用的函数返回 None,你的函数也返回 None,这时,代码可以用问号 ? 操作符简化.看下面的例子: fn ...

  3. 数据结构之树从入门到如土(四)----从零开始入门Rust实现一颗B树(未完成待续)

    B树介绍 B树是一种平衡的多路搜索树,多用于硬盘,文件系统,数据库. m阶B树性质 根节点下子节点数为 [2,m] 一个m阶B树的key数量x为: ⌈m2⌉−1<=x<=m−1⌈ \fra ...

  4. Rust即将发布1.0版本,Go持续获得关注:如何在新生语言之间做出抉择

    没有什么比谈论一门新语言能够让程序员更加兴奋.更加固执己见的了.作为两枚冉冉升起的新星,Go和Rust让我们置身在这场旋窝之中.作为灵感相似但是动机与目标完全不同的两门语言,Go和Rust可谓都是出身 ...

  5. rust怎么进入好友的房间_Rust基础知识-模块系统(上)

    当你开始构建一个大项目的时候,你就能体会到把所有代码都写在一个文件里是多么智障了:不仅难以定位负责某一功能的代码,一大片代码直接糊你脸上也觉得头晕. 当然作为一个现代语言,rust也肯定有相应的措施, ...

  6. rust货轮什么时候出现_与 Rust 在一起的四年

    2017-01-10 更新:修复坏掉的超链接,修正 "This sort is stable" 的翻译 ---- 分割线 ------ 本文翻译自 Steve Klabnik 的博 ...

  7. 怎么new一个指针_【译】Rust与智能指针

    原文链接:https://dev.to/imaculate3/that-s-so-rusty-smart-pointers-245l 原文标题:That's so Rusty!: Smart poin ...

  8. gm怎么刷东西 rust_Rust语言:解引用详述,搞不明白这个概念,趁早放弃Rust

    Rust是内存安全的,对新手来说,最大的困难是可恶的编译器,在其他语言上面叱咤风云,偏偏被Rust搞到崩溃.所以,大家都戏谑道,Rust是面向编译器编程. 和编译器做斗争的过程中,遇到最多的是,变量所 ...

  9. kotlin 添加第一个 集合_Flutter开发必学Dart语法篇之集合操作符函数与源码分析...

    简述: 在上一篇文章中,我们全面地分析了常用集合的使用以及集合部分源码的分析.那么这一节讲点更实用的内容,绝对可以提高你的Flutter开发效率的函数,那就是集合中常用的操作符函数.这次说的内容的比较 ...

  10. rust为什么显示不了国服_Rust编程语言初探

    静态.强类型而又不带垃圾收集的编程语言领域内,很久没有新加入者参与竞争了,大概大部分开发者认为传统的C/C++的思路已经不太适合新时代的编程需求,即便有Ken Tompson这样的大神参与设计的gol ...

最新文章

  1. 使用brew安装Logstash(Mac)
  2. 熵值法计算权重有异常值_指标权重确定方法 1-熵值法
  3. 《机器人编程实战》一一第2章 机器人词汇
  4. 什么是依赖注入?(听来的一个笑话)
  5. NDK 开发实战 - 封装 java 层 sdk 模型
  6. xgboost简单介绍_好文干货|全面理解项目中最主流的集成算法XGBoost 和 LightGBM
  7. android网络转圈,android基于dialog加载时转圈圈很好的demo
  8. 基于 java springboot+mybatis二手物品网站系统设计和实现
  9. 粘包拆包,Netty及远洋通信中的解决方案!超实用
  10. undefinednbsp;referencenbsp;to…
  11. Andriod开发前准备
  12. 完美刷机找不到服务器,完美刷机
  13. NS和DNS的区别有哪些?
  14. 如何将图片放大又清晰?
  15. Docker容器设置自动启动的方法
  16. Calendars and Reminders
  17. idea创建SpringBoot工程
  18. Android p刷机红米4a,红米4A(Redmi 4A 全网通)刷机教程,简单几步搞定刷机
  19. 关于使用腾讯云HiFlow场景连接器每天提醒签到打卡
  20. opencv中mask参数

热门文章

  1. 《AngularJS高级程序设计》学习笔记
  2. ubuntu LVM
  3. centos 时间服务器ntp
  4. 男人想要成功--必须明白的22个道理
  5. 「2019冬令营提高组」送分题
  6. 130.C++经典面试题 52-100
  7. Java基础——从数组到集合之间关键字的区别!!!!
  8. ARC下还会存在内存泄露吗?
  9. php内置web server
  10. 在数据库中如果组合主键(假设为stuID和stuName)存在则更新,不存在则新增