rust 教程 04 表达式

news/2025/3/22 8:40:45/文章来源:https://www.cnblogs.com/xwher/p/18786050

我们将在这篇博客中,讨论rust的expression概念,rust中大部分代码都通过表达式来完成。

表达式语言

C中的表达式有值,而语句没有值。rust是一个表达式语言,这个传统可以追溯到LISP。在C中if和switch都是语句。它们并不产生值;而在rust中ifmatch可以产生值。这也解释了为什么rust没有C中的三目运算符。

优先级和结合性

注意.有最高的优先级

块与分号

块是最通用的一种表达式,一个块可以产生值在任何地方使用。

声明

一个块还可能包含任意数量的声明,最常见的就是let声明:

let name: type = expr;

这里的type和初始化是可选的;但分号是必须的。初始化前使用变量将会报错。

if 和 match

if 表达式的用法如下:

if condition1 {block1
} else if condition2 {block2
} else {blockn
}// matchmatch code {0 => println!("hello"),_ => println!("h"),
}

注意match的arm应该覆盖所有情况。

if let

if let pattern = expr {block1
} else {block2
}if Some(cookie) = request.session_cookie {return restore_session(cookie);
}

loops

有四种loop表达式

while condition {block
}while let pattern = expr {}loop {}for pattern in iterable {}

注意loop是rust中的表达式,而while或for的值为()。 除此之外,我们可以使用..来表示一个区间,例如

for i in 0..20 {//
}

这里的0..20实际上是std::ops::Range {start: 0, end:20}. for 循环一般会消耗值,如果需要继续使用,那么使用引用,for str in &strs

loop的控制流

loop {let a = 1;break a; // 返回值
}let res = 'outer: loop {'inner: loop {if {break 'outer a; // 直接break外层的loop}}
}

return 表达式

rust中不需要显式的return表达式,可以放弃正在进行的工作

为什么需要loop

在rust中,我们有一个特殊的类型!,表示表达式不能正常完成。

fn exit(code: i32) -> !

函数调用与方法调用

一个需要注意的是在函数调用或是方法调用中,generic的通常语法并不能work,

return Vec<i32>::with_capacity(1000); // errorlet ramp = (0..n).collect<Vec<i32>>(); // error

这里的<都被识别为小于号;所以最好写成Vec::<i32>.

fields和elements

type casts

存在一些自动转换的case:

  • String类型的值可以转为&str
  • &Vec<i32> -> &[i32]

这被称为deref coercions;主要的目的是让智能指针的类型可以尽可能像其底层值那样操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/903361.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Axure RP上使用 Font Awesome 图标库

Axure RP 可以使用 Web Fonts,这让置入 Font Awesome 变得非常方便。Font Awesome 是一种字体,只是主要针对图标使用,而非我们所熟知的中文/西文字体。 进行简单的几步设置,就可以在自己项目上面使用 Font Awesome 的 1609 个免费图标。图标覆盖广泛,风格也相对统一。 一、…

读DAMA数据管理知识体系指南27文件和内容管理概念(上)

读DAMA数据管理知识体系指南27文件和内容管理概念(上)1. 文件和内容管理 1.1. 文件和内容管理是指针对存储在关系型数据库之外的数据和信息的采集、存储、访问和使用过程的管理 1.2. 重点在于保持文件和其他非结构化或半结构化信息的完整性,并使这些信息能够被访问 2. 业务驱…

(Windows11)如何自编译Aseprite(像素画软件) - 1.3.12版本

如何自编译Aseprite(像素画软件)-windows-以1.3.12版本为例 1. Aseprite说明开源像素画软件,自带调色板 Steam也可购买:steam购买2. 官方编译说明(Windows系统下) 官方库提供了win、mac以及Linux编译方式 文档地址:https://github.com/aseprite/aseprite/blob/main/INSTAL…

BUAA_OO_Unit1总结

Unit1 总结 1. 程序结构分析 1.1 代码结构(类图)1.2 类的度量统计类名 属性个数 方法个数 方法名 方法规模(代码行) 控制分支数目 类总代码规模(行)Function 4 6 Function 5 0 85sort 10 1 (双重循环)getCan 20 3 (条件+循环嵌套)huanCan 15 2 (条件替换逻辑)prework 15 …

永久免费!支持视频号下载,2025最新版本

在昨天的推文中给大家分享了一款非常不错的 Ai 工具,含有 Ai 一键抠图、Ai 无损放大等功能,对于设计和作图的小伙伴来说,非常的有帮助这款Ai 合集工具,内容丰富,且使用简单,纯在线使用,不消耗本地电脑硬件内存,有需要的小伙伴可以点击下方链接体验 一键Ai抠图、无损放大…

AbstractAutoProxyCreator#postProcessBeforeInstantiation

一、定义 postProcessBeforeInstantiation 是 Spring AOP 动态代理的核心扩展点,通过提前创建代理对象优化性能,并支持丰富的自定义逻辑(如事务、安全) 二、代码分析 public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws Be…

Day20_javascanner_struct

Java JavaDoc javadoc命令是用来生成自己API文档的 参数信息: @author 作者名 @version 版本号 @since 指明需要最早使用的jdk版本 @param 参数名 @return 返回值情况 @throws 异常抛出情况 /*** @author XXX* @version 1.0* @since 1.8*/public class Doc {String name;/*** …

k8s基本字段

k8s基本字段 limits字段 此字段限制的是硬件的资源,如果容器尝试申请超过限制的内存将会终止容器 requests字段 此字段限制的是容器可以请求的资源,可以超出request申请额外的资源,但是不能超过limits, 500m等于0.5个CPU本地临时性文件,采用这种配置时,你会把所有类型的临…

【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(3)

比赛链接 本文发布于博客园,会跟随补题进度实时更新,若您在其他平台阅读到此文,请前往博客园获取更好的阅读体验。 跳转链接:https://www.cnblogs.com/TianTianChaoFangDe/p/18786128 开题 + 补题情况 很菜的一把,就开了三个签到题,1001 Lucas 定理花了好久才看出来,明明…

51单片机学习笔记-3

串口通信UART(universal asynchronous receiver transmitter,通用异步收发器):可用来实现串口通信。串口硬件:基础串口包含TXD/RXD两个通信线,他们交叉连接。(如DB9通常使用2(RXD),3(TXD),5(GND)。) 当串口两头电平标准不一样时,需要叫电平转换芯片。TTL电平:5V表示1,…

微信小程序 -2025/3/22

HttpClient 介绍:核心api发送请求步骤小程序目录结构小程序页面组成微信登录 发送请求