首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Rust:有没有办法缩短`from_request`中的“of /else`”部分?

在Rust中,from_request是一个常用的trait,用于从请求中提取数据并将其转换为特定类型。在实现from_request时,通常会使用match表达式来处理可能的错误情况,例如解析失败或者类型转换失败。

如果你想缩短from_request中的match表达式的代码量,可以考虑使用?操作符来简化错误处理。?操作符可以在发生错误时自动返回Err,从而避免了手动编写match表达式的繁琐。

下面是一个示例代码,展示了如何使用?操作符来简化from_request中的错误处理:

代码语言:txt
复制
use actix_web::{HttpRequest, FromRequest, Error};
use futures::future::{Ready, err};

struct MyData {
    // ...
}

impl FromRequest for MyData {
    type Error = Error;
    type Future = Ready<Result<Self, Self::Error>>;
    type Config = ();

    fn from_request(req: &HttpRequest, _: &mut actix_web::dev::Payload) -> Self::Future {
        // 从请求中提取数据并进行转换
        let data = req.headers().get("X-MyData").ok_or_else(|| err("Missing X-MyData header"))?;
        let data_str = data.to_str().map_err(|_| err("Invalid X-MyData header"))?;
        let my_data = MyData { /* ... */ };

        // 返回转换后的结果
        Ok(my_data.into())
    }
}

在上述示例中,我们使用?操作符来处理可能的错误情况。如果get方法返回None,则ok_or_else会返回一个Err,并且?操作符会自动将其返回给调用方。类似地,如果to_str方法返回Err?操作符也会将其返回给调用方。

通过使用?操作符,我们可以避免手动编写match表达式来处理错误,从而使代码更加简洁和易读。

关于Rust的更多信息,你可以参考腾讯云的Rust产品介绍页面:Rust产品介绍

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

优雅地组合:谈谈 axum

相比之前我使用过 Rust web 框架,如 rocket,actix-web,axum 对我最大吸引力就是它优雅架构:它没有选择从零开始另起炉灶,而是以同样非常优秀 tower 库 Service...所以,几乎所有的 web 框架都提供了流水线处理逻辑,使得流程公共部分可以被抽取出来,成为可复用 middleware。...然而,大部分这样框架都只关注 web,甚至只关注 HTTP/1,并没有把这个逻辑抽象到适用于所有请求-响应场景。...我们看下图: 这些都是你可以在路由 handler 随便组合使用。...axum 刚推出来时,给我带来震撼是全方位,它颠覆了我对静态语言认知。我从未想过可以写出这么灵活,且还是做了严格类型检查 Rust 代码。

8.3K51

C语言快学完了,但oj上题大部分做不出来,都是在CSDN找,是不是很不正常?有没有办法改?

回到编程语言学习过程,编程语言学习最佳方式掌握一定理论基础上有项目实战,如果两种条件都是具备情况下可能几个月就能找到编程感觉,而大部分自学编程的人更多是在网络上找到自己觉得重要视频学习起来,并且通过...CSDN等途径进行知识性拓展,在某种阶段也是小有收获存在,但在大部分情况下还是处于迷茫状态,这种属于典型没有方向感方式,要摆脱这种模式建议静下心来默默梳理自己思路,先从掌握基础理论开始,...对于掌握编程理论这个阶段对于大部分学习者来讲可能都能克服,最关键实践对于绝大部分自学者来讲就是一种极大挑战,之所以存在挑战找不到匹配自己能力实践机会,即使专门培训机构也很难找到匹配实践项目...,这在编程属于混沌阶段一种思维在艰难认知过程,在这个过程中会夹杂着理论实践层次甚至还有放弃念头,这个阶段对于学习编程的人来讲时间长短不一样,每个真正程序员都是从这个阶段走过来,要顺利度过这个阶段就要坚持做自己认为准确事情...就当前环境下学习编程的人,大部分人还是选择网络或者线下培训,其实培训更多是在给人指明一种学习方向,或者再通俗点就是找一群一起学习小伙伴大家互相监督,通过集体力量来压抑自己散漫天性,从而达到学习编程目的

1.3K20

【翻译】Rust生命周期常见误区

那么 T 只能在编译期创建 大部分Rust初学者是从类似下面这个代码示例接触到 'static 生命周期: fn main() { let str_literal: &'static str...噢,我想我们对这没什么办法,代码能过编译,那么生命周期标记必然是对不是吗?...Rust同样有着对于trait对象生命周期省略规则,它们是: 如果一个trait对象作为一个类型参数传递到泛型,那么它生命约束会从它包含类型推断 如果包含类型中有唯一约束,那么就使用这个约束...(has.lifetime, "long"); } 生命周期只会在编译期被静态验证,并且Rust借用检查只能做到基本控制流分析, 它假设每个if-else代码块和match每个分支都会被执行,...变量生命周期只能缩短, 并且所有缩短都会在编译器被确定。

1.5K20

一步步靠近:Rust入门小百科

在后续章节,会依照该语言架构对Rust 语言自底向上进行分层探索,以帮助读者对Rust 语言概念融会贯通。 开源社区 Rust 语言自身作为一个开源项目,也是现代开源软件一颗璀璨明珠。...在Rust 之前诞生所有语言,都仅仅用于商用开发,但是Rust 语言改变了这一状况。对于Rust 语言来说,Rust 开源社区也是语言部分。同时,Rust 语言也是属于社区。...MIR 可以帮助实现增量编译,当你修改完代码重新编译时候,编译器只计算更改过部分,从而缩短了编译时间。 缩短执行时间。...Rust 语言有别于传统语言另一点在于,其将开源社区视为语言部分Rust 本身就是开源项目中典范,非常值得学习。...希望读者可以建立对Rust 语言系统性认知,在以后学习起到提纲挈领作用,不至于迷失在细节。 ? 本文节选自热门新书《Rust编程之道》。

1.3K20

【投稿】逃离编译时内存溢出

最简单办法是「大就是好,多就是美」,加钱上更多内存,或者分配更大 Swap 空间(没错,就像我之前有一个 暴力 32GiB Swapfile)。...让我们一起看一下,有没有什么过渡选项可以缓解这一尴尬局面,进行一些有限平衡。 「更快、更高、更强」 mold 是的,既然是链接器问题,那么最简单办法就是换一个。...Rust 默认 linker 选项设定是 cc,这意味着会利用到 gnu 工具链 ld,尽管 gnu 在自由软件领域有着卓越贡献,但以目前经验而言,这并不是一个好现代选择。...要想启用这一特性,同样有两种方法: RUSTFLAGS 在目前最新 Rust nightly ,可以使用 -C symbol-manging-version=v0 这个 RUSTFLAG ,相对旧一点版本可能需要使用...拆分成更小单元,让编译每个部分时候不会太吃力;或者去掉一些笨重依赖,让它不那么费劲;或者对编译选项进行更多调整,进行针对性优化。

76510

Rust入坑指南:亡羊补牢

如果你已经开始学习Rust,相信你已经体会过Rust编译器强大。它可以帮助你避免程序部分错误,但是编译器也不是万能,如果程序写不恰当,还是会发生错误,让程序崩溃。...所以今天我们就来聊一聊Rust如何处理程序错误,也就是所谓“亡羊补牢”。 基础概念 在编程遇到非正常情况通常可以分为三类:失败、错误、异常。...Option Option我们在Rust入坑指南:千人千构一文我们进行过一些介绍,它是一种枚举类型,主要包括两种值:Some(T)和None,Rust也是靠它来避免空指针异常。...在前文中,我们并没有详细介绍如何从Option中提取出T,其实最基本,可以用match来提取。而我也在前文中给你提供了官方文档链接,不知道你有没有看。...(None.unwrap_or_else(|| 2 * k), 20); } 这是从Option中提取值方法,有时我们会觉得每次处理Option都需要先提取,然后再做相应计算这样操作比较麻烦,那么有没有更加高效操作呢

81810

第6章 | 表达式 | 优先级,块与分号,生命,if match

LISP 程序员知道一切价值(value),但不了解其代价。 ——Alan Perlis 本章将介绍 Rust 表达式,它是函数体组成部分,因而也是大部分 Rust 代码组成部分。...Rust 大多数内容是表达式。本章将探索表达式强大功能以及如何克服它局限性。我们将介绍在 Rust 完全面向表达式控制流,以及 Rust 基础运算符如何独立工作和组合工作。...第二个定义会在所处代码块其余部分代替第一个定义。这叫作遮蔽(shadowing),在 Rust 程序很常见。...Rust 也有闭包,闭包可以看到封闭块作用域内变量。请参阅第 14 章。) 块甚至可以包含完整模块。这可能看起来有点儿过分(真的需要把语言每一部分都嵌进任何其他部分吗?)...,但是程序员(特别是使用宏程序员)总是有办法为语言提供每一种独立语法找到用武之地。

7210

Rust编程学习笔记Day7-一个值可以有多个所有者吗?

Rust处理思路,大部分场景能在编译器处理,这样能保证安全性和性能要求;运行时检查,会牺牲部分性能,来提高灵活性 那Rust在运行时如何做检查呢?...Box是Rust智能指针,可以强制吧数据创建在堆上,然后在栈上用一个指针指向这个数据结构,但这时候堆内存生命周期是可控,跟栈上指针保持一致。...搞明白了 Rc,我们就进一步理解 Rust 是如何进行所有权静态检查和动态检查了: 静态检查,靠编译器保证代码符合所有权规则; 动态检查,通过 Box::leak 让堆内存拥有不受限生命周期,然后在运行过程...RefCell Rc只是一个只读引用计数器,我们没有办法拿到Rc结构内部数据可变引用,来修改这个数据,因此需要RefCell来达成对只读数据可变借用,称为内部可变性,Rc和RefCell可以搭配使用...注意:这里在可变借用时候用一对{},这是因为使用 {} 缩短可变借用生命周期。

93030

Rust社区冲突不断,创始人:别Call我了,我也救不了!

首先,Hoare 提起最近人们执问题,“你有没有想过在 Rust 项目中 BDFL(终身扮演仁慈独裁者?)”而如果他真的这样做了,Rust 项目的发展会不会更加顺遂?...在 2009 年到 2013 年担任项目的技术主管时,我就已经快到极限了……另外,我觉得自己没办法建立起强大或者健康团队制度,处理不好决策、冲突、授权和扩展之类具体工作。”...他强调他心目中 Rust“可能会让所有参与者都不满意,也没办法像现在这样真正破圈……” “请别误会我意思:我对现在结果非常满意。...但是……” 在文中,Hoare 也列出了“Rust 那些我特别不认可且 / 或目前不太喜欢地方。”比方说,在文中“复杂语法”这部分,Hoare 就抱怨说 Rust 仍然难于解析。...“同样,我也会牺牲掉一部分表达力。

27430

Rust日报】2023-11-21 如何将 Rust 编译效率提高 75%

因此,如果遇到棘手错误,你可能需要调整优化级别。 Mold Rust 编译器基本步骤大致如下,首先读取源代码,将其转换为多种类型 IR(中间表示),并在转换过程执行优化。...这也是启用 Sold 方式,只需用 Sold 路径替换模具路径,并将目标更改为 Mac 编译目标。 Cranelift 在上面的优化,我们替换了 Rust 编译器使用链接器。...,Cranelift 仍在开发,可能存在一些缺少内在功能问题。...因此,部分 crate 可能无法在正常地工作。如果您发现缺少什么功能,我鼓励您提交 Issue,可能会有可用解决方法。...Conclusion 经过一系列测试和评判(可以看原文),我们发现启用 Mold 和 Cranelift 为我带来了 75% 增量编译时间缩短和 25% 冷编译时间缩短,这是相当大改进。

92010

到底该选 Rust 还是 Go,成2023年最大技术分歧

8 月 7 日,Rust 基金会发布了 2022 年度 Rust 调查报告结果,报告显示 Rust 采用率不断提高,超过 90% 调查受访者表示自己是 Rust 用户;29.7% 受访者表示,他们在工作部分编码工作都使用...聊了这么多问题,再加上两种语言都设计得如此精良、功能如此强大,那这场比拼到底有没有结果?...Go 垃圾收集器非常高效,而且做了优化以尽可能缩短暂停时长(随着 Go 新版本发布,暂停时长也是越来越短)。...—Grzegorz Nosek 包括 Go 在内,很多语言也提供帮助程序员避免错误工具,但 Rust 把这种效果提升到了新水平。很多不正确程序甚至根本没办法编译。...但如果您时间只搞认真钻研一门语言,那请千万先把 Go 和 Rust 各自专长和倾向性搞清楚,之后再做选择。 当然,关于编程语言知识只是成就一名成功软件工程师很少一部分

90420

tokio之如何观测Rust异步任务调度

通过之前Rust 异步编程之 Future 初探》我们知道Rust异步是以task调度来构建。task作为抽象在语言层面的调度单元。 那如果想要观测其调度执行有没有办法呢? 有的!...console-subscriber = "0.2.0" tokio = { version = "1.35.1", features = ["full", "tracing"] } 异步代码main也需要初始化...(cargo install tokio-console可以安装) 代码改造 以之前《Rust 并发控制之 Semaphore-两线程交替打印》代码来观测为例 修改部分详见代码注释: use std::...task-detail resource 对于resource, 能看到执行了哪些类型异步操作 resource 详情是对这个操作不同时间调用详细展开。...比如t2semaphore_wait.acquire三次调用 resource-details 本文代码详见tokio-play[2] 想查看更多异步观测例子建议查看下官方例子[3] 参考资料

16510

揭秘前端眼中Rust

部分语言内存模型都是大同小异。...栈数据是不需要做内存管理,随着代码执行,一个变量很容易被判断还有没有用——只要这个变量作用域结束,那么再也无法读取到这个变量值,那么这个变量肯定没用了。...这两种办法各有优劣,前者导致程序必须带一个runtime,runtime当中存放GC算法,导致程序体积变大,而后者,则变得内存不安全,或者说,由于内存管理责任到了程序员头上,程序员水平极大程度上影响了代码安全性...有没有啥问题? 虽然我上文说了许多Rust好,但我在学习Rust时候却有些备受打击,很大一个原因在于,Rust过于特立独行了。...上述提到Rust比较特别的点非常多,虽然大部分都只是设计理念不同,没有高下优劣之分,但如此设计确实会给其他语言开发者带来一部分心智负担。

1K20

从字符串来浅谈Rust内存模型

在这篇文章,我将尝试通过字符串实现来对Rust存储管理进行分析。本文目标读者是对Rust没有了解或了解不多初学者。...但是由于并不是所有数据都像字符串一样分为两个部分,因此Rust建立了一个抽象概念——所有权。对Rust而言变量占有了它存储数据(获得所有权),因此其他变量无法再拥有这个数据,除非通过操作转移所有权。...() { a } else { b } } 这里在每个引用后面引入了'a符号,用来标记引用生命期为a。...b生命期太短 这是因为Rust是在编译期确定生命期,因此没办法根据函数逻辑决定生存期长短。 所有权与可变性 另一个Rust重新调整操作顺序例子就是可变性。...但这就是问题根源,因为Rust办法针对单个数据检查借用规则。

92310

非凸Rust高性能日志库ftlog

图片日志是应用程序重要组成部分,无论是服务端程序还是客户端程序,都需要日志作为错误输出或业务记录。非凸Rust高性能日志库ftlog,支持“受限写入”以及“时间分割”等功能,具备显著性能优势。...低延迟交易,要求整个交易链条上所有环节,都尽量缩短时间间隔。而非凸日志库ftlog在速度上更快,可实现更低延迟。过去,金融证券领域高性能一般指的是高吞吐量,满足一定延迟要求。...非凸科技选择Rust,最主要原因是Rust高性能、高安全和可靠性与低延迟交易核心需求高度匹配。...在引擎层面,Rust具有可靠安全性和稳定性;在数据接入层面,Rust足够底层,可以做到更多其他语言难以做到事。此外,对于企业级项目的开发,采用Rust更能保证程序稳定性。...对于高并发和低延迟部分Rust相关成熟库还不多,需要企业级打磨才能更可靠。对此,非凸科技将在开源项目上不断发力,攻坚更多核心技术。做真正自研技术,尤其是基础软件和核心底层技术。

65520

前端眼中Rust

部分语言内存模型都是大同小异。...栈数据是不需要做内存管理,随着代码执行,一个变量很容易被判断还有没有用——只要这个变量作用域结束,那么再也无法读取到这个变量值,那么这个变量肯定没用了。...但更多情况下,前端部分工具都是完全不在乎性能,直接用js写,比如Babel、ESLint、webpack等等,有很大一部分原因在于C++实在不太好入门,光是几十个版本C++特性,就足够让人花掉大量时间来学习...有没有啥问题?虽然我上文说了许多Rust好,但我在学习Rust时候却有些备受打击,很大一个原因在于,Rust过于特立独行了。...上述提到Rust比较特别的点非常多,虽然大部分都只是设计理念不同,没有高下优劣之分,但如此设计确实会给其他语言开发者带来一部分心智负担。

1K330

如何理解Rust核心特性(所有权、借用、生命周期)

上一篇文章,我简单讲解了一下,我作为一个前端是如何看待Rust,里面稍微提及了一下Rust所有权机制和内存安全,说着Rust所有权机制以及后续带来生命周期问题确实不好理解,我一边看了TRPL...基本内存模型首先先从基本内存模型讲解,这一部分大家应该都比较熟悉,几乎所有语言内存模型都是大同小异(我没见过特别奇怪,当然也可能是我孤陋寡闻)。...,这样一来,程序执行过程仍然可以调用到这个数据,这一个地方我们称之为堆。...这两种算法各自有各自问题,算法一对程序员要求很高,稍有不慎就会内存泄漏。第二种办法则需要带一个runtime,增大程序体积。而rust则实现了与以上两个流派都不一样第三个流派。...换句话说,有没有借用、有多少个借用、都不影响内存回收时机,内存回收只看一个时机,那就是所有权变量出栈时机。

87550

那位用Rust重写数据库创始人来复盘了:删除27万行C++代码,值吗?

InfoQ:从之前披露文章可以看到团队最初选择是 C++ 语言来构建,并集结了多位具有 10 年以上经验 C++ 工程师,当时是看中了 C++ 哪些特质还只是遵循市面上大部分数据库系统选择?...我们收获是系统更加稳定、安全,且代码清晰,尤其是包管理部分有非常大提升。...此外,Rust 本身在高速发展,整个社区非常有活力,提问基本都能够得到及时回复,这是我们从 Rust 生态受益地方。...吴英骏:团队中有部分工程师之前就懂 Rust,只是未在工作中使用,这部分工程师还是比较容易转型。...吴英骏:Rust 确实存在编译时问题,但编译 C++ 相对也比较慢,但目前还在可承受范围之内,如果时间比较长,工程师会定期查看编译进度,并尝试是否有办法可以缩短这个时间。

80310

Rust日报】2019-09-04 - retest一个基于 fixture rust测试框架

CPP工程师Rust迁移之路 #rust #cpp 5.继承与组合 - 下 4.继承与组合 - 3.继承与组合 - 上 2.类与结构体 1.起步 Read More regex 1.3改动 #rust...#crate regex1.3允许禁用Unicode等影响性能特性,这可以减少超过1MB二进制文件大小,将编译时间缩短一半,并将依赖关系树减少到一个包。...我们可以从一个issue#613了解这些改动原因: 这些变化另一个动机是允许正则表达式用户缩小其依赖树,如果他们希望交换运行时性能。...最终结果是它将大大缩小二进制大小,缩短编译时间并将正则表达式依赖树缩小到单个包(正则表达式语法)。 发起这个PR是BurntSushi大神。...Repo retest 一个基于 fixture rust测试框架 #test #rust 我们可以通过两组测试代码看一下这个框架是如何工作 use rstest::rstest; pub fn

75820
领券