Rust : ? 操作符(待续)
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 : ? 操作符(待续)相关推荐
- 转: Oracle 索引详解
一. 索引介绍 1.1 索引的创建语法 CREATE UNIUQE | BITMAP INDEX <schema>.<index_name> ...
- Rust:用问号 ?操作符简化错误信息的判断
Option 返回值 如果你调用的函数和你正在写的函数都返回 Option 类型,如果你调用的函数返回 None,你的函数也返回 None,这时,代码可以用问号 ? 操作符简化.看下面的例子: fn ...
- 数据结构之树从入门到如土(四)----从零开始入门Rust实现一颗B树(未完成待续)
B树介绍 B树是一种平衡的多路搜索树,多用于硬盘,文件系统,数据库. m阶B树性质 根节点下子节点数为 [2,m] 一个m阶B树的key数量x为: ⌈m2⌉−1<=x<=m−1⌈ \fra ...
- Rust即将发布1.0版本,Go持续获得关注:如何在新生语言之间做出抉择
没有什么比谈论一门新语言能够让程序员更加兴奋.更加固执己见的了.作为两枚冉冉升起的新星,Go和Rust让我们置身在这场旋窝之中.作为灵感相似但是动机与目标完全不同的两门语言,Go和Rust可谓都是出身 ...
- rust怎么进入好友的房间_Rust基础知识-模块系统(上)
当你开始构建一个大项目的时候,你就能体会到把所有代码都写在一个文件里是多么智障了:不仅难以定位负责某一功能的代码,一大片代码直接糊你脸上也觉得头晕. 当然作为一个现代语言,rust也肯定有相应的措施, ...
- rust货轮什么时候出现_与 Rust 在一起的四年
2017-01-10 更新:修复坏掉的超链接,修正 "This sort is stable" 的翻译 ---- 分割线 ------ 本文翻译自 Steve Klabnik 的博 ...
- 怎么new一个指针_【译】Rust与智能指针
原文链接:https://dev.to/imaculate3/that-s-so-rusty-smart-pointers-245l 原文标题:That's so Rusty!: Smart poin ...
- gm怎么刷东西 rust_Rust语言:解引用详述,搞不明白这个概念,趁早放弃Rust
Rust是内存安全的,对新手来说,最大的困难是可恶的编译器,在其他语言上面叱咤风云,偏偏被Rust搞到崩溃.所以,大家都戏谑道,Rust是面向编译器编程. 和编译器做斗争的过程中,遇到最多的是,变量所 ...
- kotlin 添加第一个 集合_Flutter开发必学Dart语法篇之集合操作符函数与源码分析...
简述: 在上一篇文章中,我们全面地分析了常用集合的使用以及集合部分源码的分析.那么这一节讲点更实用的内容,绝对可以提高你的Flutter开发效率的函数,那就是集合中常用的操作符函数.这次说的内容的比较 ...
- rust为什么显示不了国服_Rust编程语言初探
静态.强类型而又不带垃圾收集的编程语言领域内,很久没有新加入者参与竞争了,大概大部分开发者认为传统的C/C++的思路已经不太适合新时代的编程需求,即便有Ken Tompson这样的大神参与设计的gol ...
最新文章
- 使用brew安装Logstash(Mac)
- 熵值法计算权重有异常值_指标权重确定方法 1-熵值法
- 《机器人编程实战》一一第2章 机器人词汇
- 什么是依赖注入?(听来的一个笑话)
- NDK 开发实战 - 封装 java 层 sdk 模型
- xgboost简单介绍_好文干货|全面理解项目中最主流的集成算法XGBoost 和 LightGBM
- android网络转圈,android基于dialog加载时转圈圈很好的demo
- 基于 java springboot+mybatis二手物品网站系统设计和实现
- 粘包拆包,Netty及远洋通信中的解决方案!超实用
- undefinednbsp;referencenbsp;to…
- Andriod开发前准备
- 完美刷机找不到服务器,完美刷机
- NS和DNS的区别有哪些?
- 如何将图片放大又清晰?
- Docker容器设置自动启动的方法
- Calendars and Reminders
- idea创建SpringBoot工程
- Android p刷机红米4a,红米4A(Redmi 4A 全网通)刷机教程,简单几步搞定刷机
- 关于使用腾讯云HiFlow场景连接器每天提醒签到打卡
- opencv中mask参数