首页 > 其他分享 >上面这段代码,?的作用是: 如果返回Result::OK(T),则f类型为T; 如果返回Result::Err(error),则函数返回Result::Err(error) 是这个意思呗?

上面这段代码,?的作用是: 如果返回Result::OK(T),则f类型为T; 如果返回Result::Err(error),则函数返回Result::Err(error) 是这个意思呗?

时间:2024-12-24 16:10:58浏览次数:4  
标签:返回 Ok Err read Result error

use std::fs::File;
use std::io;
use std::io::Read;

fn read_username_from_file() -> Result<String, io::Error> {
    let mut f = File::open("hello.txt")?;
    let mut s = String::new();
    f.read_to_string(&mut s)?;
    Ok(s)
}

上面这段代码,?的作用是:
如果返回Result::OK(T),则f类型为T;
如果返回Result::Err(error),则函数返回Result::Err(error)

是这个意思呗?

UUUUUUUUUUUUUUUUUUUUUUUU
是的,您的理解是正确的!在这段代码中,? 运算符用于简化错误处理,它的作用就是:

  • 如果 ResultOk(T),则提取其中的值 T,并继续执行下一步的代码。
  • 如果 ResultErr(error),则会立即从当前函数返回这个 Err(error),不再执行后续的代码。

详细解释:

  1. let mut f = File::open("hello.txt")?;

    File::open("hello.txt") 返回一个 Result<File, io::Error>,即成功时返回 Ok(File),失败时返回 Err(io::Error)

    • 如果 ResultOk(f),那么 f 就是 File 类型的对象,程序继续执行。
    • 如果 ResultErr(error)? 运算符会让当前函数 read_username_from_file 立即返回 Err(error),所以不会执行后续的代码。
  2. f.read_to_string(&mut s)?;

    f.read_to_string(&mut s) 返回一个 Result<usize, io::Error>,即成功时返回 Ok(usize)(表示读取的字节数),失败时返回 Err(io::Error)

    • 如果 ResultOk(_),程序继续执行。
    • 如果 ResultErr(error)? 运算符会让函数立刻返回 Err(error)

整个函数流程:

  • 如果在打开文件或者读取文件时遇到错误,? 会让 read_username_from_file 函数返回 Err(io::Error),并且不会执行后续的代码。
  • 如果一切正常,函数会继续执行,直到最后 Ok(s) 被返回。

举个例子:

假设文件 hello.txt 不存在,File::open("hello.txt") 会返回 Err(io::Error)。然后,? 运算符会直接让 read_username_from_file 函数返回这个 Err(io::Error),不会再去调用 f.read_to_string(&mut s)

而如果文件存在并成功打开,f.read_to_string(&mut s) 会尝试读取内容,并且只有在出现读取错误时才会返回 Err

总结:

? 运算符是用来简化错误处理的工具,它的作用是:

  • 如果 ResultOk(T),返回其中的 T
  • 如果 ResultErr(E),则提前从函数返回 Err(E)

因此,您的理解完全正确!

标签:返回,Ok,Err,read,Result,error
From: https://www.cnblogs.com/Tifahfyf/p/18627929

相关文章

  • 看下面这个Rust程序,我想知道 other_error => panic!("Problem opening the file: {:?}
    看下面这个Rust程序,我想知道other_error=>panic!("Problemopeningthefile:{:?}",other_error)这一行代码,为什么是other_error=>panic...而不是_=>panic...?usestd::fs::File;usestd::io::ErrorKind;fnmain(){letf=File::open("hello.txt&qu......
  • ESP32 HTTP Client 报错'Error parse url'
    ESP32HTTPClient报错今天在使用ESP32中的esp_http_client_init如下//结构体typedefstruct{charurl[256];}config_t;//主要代码strncpy(config.url,"http://xxx/xxx",sizeof(config.url)-1);config.url[sizeof(config.url)-1]='\0';//确保字符串以空......
  • Python TypeError: list和list之间不支持减法操作
    在本文中,我们将介绍Python中的TypeError错误,特别是在进行列表相减时出现的TypeError:unsupportedoperandtype(s)for-:‘list’and‘list’错误。我们将深入探讨这个错误的原因,并提供一些解决这个错误的方法。 了解TypeError错误TypeError是Python中常见的错误类型之一......
  • 自建Anki服务器,并用AnkiDroid连接,解决error sending request for url()或用户名或密码
    说明参考:https://www.gerenbiji.com/blog/2024年/自建Anki同步服务器/官方文档:https://docs.ankiweb.net/sync-server.html环境:RockyLinuxx86平台方案:使用官方桌面客户端自带的服务器1.下载官方客户端https://apps.ankiweb.net/2.运行命令SYNC_USER1=[用户名1]:[明......
  • 猫头虎 分享已解决Bug:解决 AttributeError: module ‘scipy.misc‘ has no attribute
    ......
  • WPF HitTestResult
    usingSystem.Text;usingSystem.Windows;usingSystem.Windows.Controls;usingSystem.Windows.Data;usingSystem.Windows.Documents;usingSystem.Windows.Input;usingSystem.Windows.Media;usingSystem.Windows.Media.Imaging;usingSystem.Windows.Navigation;......
  • 解决Dede织梦上传图片失败 ERROR:Copy Uploadfile Error! 提示
    错误显示:拷贝(复制)上传文件出错!原因:上传的文件损坏。上传目录无写权限。解决方法:尝试上传其它图片。给uploads写入权限:Linux服务器:通过FTP设置 uploads 目录为777权限,子文件夹选择继承。Windows2003服务器:右键文件夹属性->安全->添加账户->增加 IUSER_机器名......
  • Jmeter 修改Sampler result 结果信息
    首先说一下,jmeter的Samplerresult是什么?Jmeter的Samplersresult是jmeter在向服务器发送请求后,接收到服务器响应的基本信息的展示,如sample的开始请求时间、发送的内容大小、基于协议的响应状态码和响应消息等信息。什么是基于协议的响应状态码和响应消息。比如http协议的状......
  • 【新手入门】树莓派Raspberry 3B+硬件安装散热片、散热风扇、外壳安装
    树莓派RaspberryPi3B+学习笔记今日达成:①散热片安装②散热风扇安装③外壳安装散热片安装我买的套装给了三个散热片,查了查网上的资料,比较应该比较的就是两个,分别给GPU和CPU散热(都在正面),散热片贴在正中间就可以,直接上图。找到一个比较好的视频,分享给大家:https://video.t......
  • 用pandas读取MRPC数据库时报错:pandas.errors.ParserError: Error tokenizing data. C
    读取的代码很简单,如下:data_path='MRPC/msr_paraphrase_test.txt'df=pd.read_csv(data_path,sep='\t',encoding='utf-8')困扰了一下午,最后本来不打算解决了。想着直接跳过错误,即:df=pd.read_csv(data_path,sep='\t',encoding='utf-8',on_......