【Rust】002-基础语法:函数

2023-10-27

【Rust】002-基础语法:函数

一、概述

在 Rust 中,函数是组织代码的一个基本模块。前面几节中我们已经见过了 Rust 最重要的函数 main 函数,它是整个程序的入口。有了函数,我们就可以把代码逻辑片段封装在其中,从而提高代码的可读性和复用性。

二、函数

1、基本函数

fn greet() {
    println!("Welcome!");
}

2、参数

// 主函数,程序的入口点
fn main() {
    // 使用 let 关键字声明一个不可变变量 name,并初始化为 "訾博"
    let name = "訾博";

    // 将不可变变量 name 的引用传递给 print_name 函数
    // 注意:这里没有使用 to_string(),因为 print_name 接受的是字符串切片 &str 类型
    print_name(name);
}

// 自定义函数 print_name,接受一个字符串切片 &str 类型的参数 name
fn print_name(name: &str) {
    // 打印输出 "name: " 和变量 name 的内容
    // {} 是一个占位符,用于插入变量的值
    println!("name: {}", name);
}

3、即时补充:函数参数是 String&str 的区别

String

  • String 是一个可变、可增长的字符串类型,存储在堆上。
  • 通常用于需要修改或动态构建字符串的场景。
  • 拥有该字符串的所有权。
  • 常常通过 .to_string()String::from() 从一个字符串字面量创建。
let mut s = String::from("hello");
s.push_str(", world!"); // 可以修改字符串

&str

  • &str 是一个字符串切片,通常用作函数参数,表示对某个字符串的不可变引用。
  • 它是轻量级的,并且是借用的,所以不拥有该字符串的所有权。
  • 通常用于读取字符串,并且通常用于固定或已知长度的字符串。
fn print_name(name: &str) {
    println!("name: {}", name);
}

let s = String::from("hello");
print_name(&s); // 可以传入String的引用
print_name("world"); // 可以直接传入字面量

对比

  • &str通常更快,因为它是不可变和轻量级的。
  • String 在需要所有权或需要修改字符串时是必要的。
  • 在函数参数中,使用 &str 通常更灵活,因为它允许你接受任何字符串数据的引用。

4、返回值

Rust 的函数可以返回一个值给它的调用方。不过在介绍返回值之前,需要插入两个概念的介绍——语句(statement)和表达式(expression)

语句和表达式

语句通常表示执行一个动作,并且不会返回任何值。用 let 做变量绑定就是一个语句,例如:

fn main() {
    let x = 1;
}

函数的定义也是一个语句。例如上面的 main 函数定义,整体就是一个语句。

刚才说了语句没有返回值,因此下面的写法是错误的:

fn main() {
    let x = (let y = 2);
}

let y = 2是一个语句,没有返回值,因此不能把x绑定上去。

跟语句不同,表达式会求值,然后返回一个值。常见的表达式有下面几种情况:

  1. 算术表达式:1+2是一个表达式,返回值是 3。甚至3本身也是一个表达式
  2. 函数调用:add(1, 2)也是一个表达式,因为函数会返回一个值。
  3. 宏调用
  4. 用花括号包裹的最终返回一个值的代码块

语句块示例

fn main() {
    // 这个语句块最后返回了temp - 1。
    // 注意这里的temp - 1后面没有分号。
    // 表达式最后不能有分号,一旦加上了分号,就会变成一个语句,而语句没有返回值。
    let result = {
        let temp = 10 * 3;
        temp - 1
    };
}

返回值

fn add(a: i32, b: i32) -> i32 {
    a + b
}

fn main() {
    let num1 = 5;
    let num2 = 7;

    let sum = add(num1, num2);
    println!("The sum of {} and {} is {}.", num1, num2, sum);
}

使用 return

fn pass_exam(score: u32) -> bool {
    if score < 60 {
        return false;
    }
    true
}

如果一个函数没有返回值,那么其实会隐式的返回一个单元类型(),类似 java 的 void 了!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Rust】002-基础语法:函数 的相关文章

  • 从 java sdk 向对等方发送提案时出现访问被拒绝错误

    我正在尝试使用以下代码查询区块链并收到访问被拒绝错误 我也遇到同样的错误sendTransactionProposal方法也是如此 UserContext adminUserContext RegisterEnrollUser regist
  • JPA 中的复合键

    我想创建一个具有自动生成的主键的实体 而且还有一个由其他两个字段组成的唯一复合键 我如何在 JPA 中执行此操作 我想这样做是因为主键应该用作另一个表中的外键 并且使其复合并不好 在下面的代码片段中 我需要命令和模型是唯一的 pk当然是主键
  • Java:无法从同一包中的不同类访问静态变量

    这很奇怪 因为我有一个可以访问 Frame dimension getWidth 的 Character 类 及其伙伴 getHeight 但是当我想在 Map 类中使用它时 Eclipse 强调了它并且无法给我反馈 运行该程序最终会出现
  • 如何在 Antlr4 中为零参数函数编写语法

    我的函数具有参数语法 如下面的词法分析器和解析器 MyFunctionsLexer g4 lexer grammar MyFunctionsLexer FUNCTION FUNCTION NAME A Za z0 9 DOT COMMA L
  • GWT - 如何组织项目以拥有多个网页以及它们之间的导航

    我是 GET 的新手 顺便说一句 它给我留下了深刻的印象 并且发现它对于像我这样熟悉 C NET 桌面技术并愿意编写 Web 应用程序的人来说非常有吸引力 我根据 GWT Eclipse 向导生成的示例启动了自己的项目 该项目生成带有面板的
  • Spring RestTemplate 使用 cookie 遵循重定向

    最近我遇到了一个问题 我需要做一个GET请求远程服务 我假设使用一个简单的 servlet 并且 RestTemplate 返回Too many redirects 经过一番调查 似乎对指定远程服务发出的第一个请求实际上只是一个 302 重
  • 如何将 Mat (opencv) 转换为 INDArray (DL4J)?

    我希望任何人都可以帮助我解决这个任务 我正在处理一些图像分类并尝试将 OpenCv 3 2 0 和 DL4J 结合起来 我知道DL4J也包含Opencv 但我认为它没什么用 谁能帮我 如何转换成 INDArray 我尝试阅读一些问题here
  • 如何在代理后面安装 Eclipse Neon

    对于 Neon Eclipse 附带了一个安装程序 我在安装程序中找不到任何配置菜单 我的java版本是 java version java version 1 8 0 72 Java TM SE Runtime Environment b
  • 如何根据运行的 jar 的结果让我的 ant 任务通过或失败?

    我正在运行 CrossCheck 无浏览器 js 单元测试 作为 ant 脚本的一部分 如果 CrossCheck 测试失败 我希望 ant 报告失败 这是 build xml 中的相关部分
  • 当客户端关闭连接时,Spring StreamingResponseBody 请求线程未清理

    我在控制器中有一个端点 它返回一个StreamingResponseBody 用于向客户端发送文件 其代码大致如下 RestController RequestMapping value api public class Controlle
  • 什么时候可以在 Java 中使用 Thead.stop() ?

    Thread stop 的 Java 文档听起来好像如果您调用 Thread stop 世界就会终结 已弃用 这种方法本质上是不安全的 停止线程 Thread stop 导致它解锁所有已锁定的监视器 作为未经检查的 ThreadDeath
  • 需要使用 joda 进行灵活的日期时间转换

    我想使用 joda 解析电子邮件中的日期时间字符串 不幸的是我得到了各种不同的格式 例如 Wed 19 Jan 2011 12 52 31 0600 Wed 19 Jan 2011 10 15 34 0800 PST Wed 19 Jan
  • 自动生成Flyway的迁移SQL

    当通过 Java 代码添加新模型 字段等时 JPA Hibernate 的自动模式生成是否可以生成新的 Flyway 迁移 捕获自动生成的 SQL 并将其直接保存到新的 Flyway 迁移中 以供审查 编辑 提交到项目存储库 这将很有用 预
  • 套接字的读写如何同步?

    我们创建一个套接字 在套接字的一侧有一个 服务器 在另一侧有一个 客户端 服务器和客户端都可以向套接字写入和读取 这是我的理解 我不明白以下事情 如果服务器从套接字读取数据 它在套接字中是否只看到客户端写入套接字的内容 我的意思是 如果服务
  • 生成的序列以 1 开头,而不是注释中设置的 1000

    我想请求一些有关 Hibernate 创建的数据库序列的帮助 我有这个注释 下面的代码 在我的实体类中 以便为合作伙伴表提供单独的序列 我希望序列以 1000 开头 因为我在部署期间使用 import sql 将测试数据插入数据库 并且我希
  • 使用 Mockito 模拟某些方法,但不模拟其他方法

    有没有办法使用 Mockito 模拟类中的某些方法 而不模拟其他方法 例如 在这个 诚然是人为的 Stock我想嘲笑的班级getPrice and getQuantity 返回值 如下面的测试片段所示 但我想要getValue 执行乘法 如
  • 流中的非终结符 forEach() ?

    有时 在处理 Java Stream 时 我发现自己需要一个非终端 forEach 来触发副作用但不终止处理 我怀疑我可以用 map item gt f item 之类的方法来做到这一点 其中方法 f 执行副作用并将项目返回到流中 但这似乎
  • 在 SWT/JFace RCP 应用程序中填充巨大的表

    您将如何在 SWT 表中显示大量行 巨大是指超过 20K 行 20 列的东西 不要问我为什么需要展示那么多数据 这不是重点 关键是如何让它尽可能快地工作 这样最终用户就不会厌倦等待 每行显示某个对象的实例 列是其属性 一些 我想使用 JFa
  • 将 Apache Camel 执行器指标发送到 Prometheus

    我正在尝试转发 添加 Actuator Camel 指标 actuator camelroutes 将交换 交易数量等指标 发送到 Prometheus Actuator 端点 有没有办法让我配置 Camel 将这些指标添加到 Promet
  • Java EE 目录结构

    我对以下教程有疑问 http www mkyong com jsf2 jsf 2 internationalization example http www mkyong com jsf2 jsf 2 internationalizatio

随机推荐

  • 数据恢复软件

    数据恢复软
  • 某兮二开网钛清爽白色风资源娱乐网模板

    介绍 网钛黑白模板修改版 全网首发无任何后门 无泛滥 最近更新栏目移动到右边 左边栏目美化 顶部美化 底部修复字体不显示bug 新增超多美化代码 附赠右侧联系站长插件等等 网钛黑白模板直接覆盖即用 部分链接需要修改模板文件 网盘下载地址 h
  • org.apache.ibatis.exceptions.PersistenceException:

    org apache ibatis exceptions PersistenceException 报错如下 错误代码提示 错误信息中的关键信息 翻译 源代码如下 错误分析 解决 报错如下 错误代码提示 错误信息中的关键信息 翻译 错误分析
  • ES elasticsearch 的 索引 alias 别名的添加

    原文链接 https www elastic co guide en elasticsearch reference current indices add alias html es 的索引别名和索引名称在好多地方都是可以等价使用的 可以
  • OpenGL实现场景漫游(Qt版)

    本文固定链接 http liusir name qt learning faqs html 民警小刘 一个不错的OpenGL程序当然免不了对整个场景的漫游 在我程序中便是用W A S D来靠近 远离 向左 向右来移动场景 Q E Z C则是
  • Linux 各个发行版分支图

    第一次知道原来linux发行版有这么多 以前也就知道里面的4 5个 图片来源 http i linuxtoy org docs guide ch48s09 html
  • JSP访问数据库以及JavaBean(封装数据和封装业务逻辑)

    1 JSP访问数据库 JSP就是在html中嵌套的java代码 因此 java代码可以写在jsp中 导包操作 java项目 1 Jar复制到工程中 2 右键该Jar build path gt add to build Path Web项目
  • C:函数指针

    函数指针的定义 typedef int compare ptr int int so there is a Type named compare ptr int max int x int y return x gt y x y 函数指针的
  • 找出链表中间结点的三种解法

    初阶链表刷题 注意 学习的是解题的思维 找出链表的中间结点 链接在末尾 解题思路 数组解法 由于链表不能通过下标访问对应的结点 所以我们将所有的结点存储在数组中 这样就可以通过下标访问数组的中间元素 继而找到链表的中间结点 1 开辟一个数组
  • SpringCloudAlibaba完整章节七(熔断器仪表盘监控)

    Sentinel 控制台 Sentinel 控制台提供一个轻量级的控制台 它提供机器发现 单机资源实时监控 集群资源汇总 以及规则管理的功能 您只需要对应用进行简单的配置 就可以使用这些功能 注意 集群资源汇总仅支持 500 台以下的应用集
  • cvc-complex-type.2.4.a: 发现了以元素 ‘base-extension‘ 开头的无效内容。应以 ‘{layoutlib}‘ 之一开头

    不能飞的猪只是没用的猪 宫崎骏 红猪 常见的1种case 记录一下 新电脑安装android studio导入公司那些gradle还是5 5左右的工程以后 各种不适应 编译问题出现了 老电脑都是好好的 cvc complex type 2
  • Largest BST Subtree

    Given a binary tree find the largest subtree which is a Binary Search Tree BST where largest means subtree with largest
  • 关于STL中vector容器的一些总结

    vector作为STL提供的标准容器之一 是经常要使用的 有很重要的地位 并且使用起来也是灰常方便 vector又被称为向量 vector可以形象的描述为长度可以动态改变的数组 功能和数组较为相似 1 vector的简单介绍 vector作
  • N-MOS,P-MOS 输入电路设计

    在电源端 主要有防反 开关 TVS 抛负载 可以使用P MOS和N MOS 一般使用P MOS设计 一般防反 TVS 开关管 如果电路过大 可以考虑并联p MOS N MOS一般价格更低 电流更大些 但是在电源输入端需要增加升压电路或者升压
  • 【Springboot】启用gzip压缩response

    加入配置就行了 springboot gzip server compression enabled true server compression mime types application vnd mapbox vector tile
  • jquery总结大纲

    一 选择器 基本选择器 什么是 id element class selector1 selector2 selectorN 答 根据给定的id匹配一个元素 用于搜索 通过id的属性给定值 案例 查找id为da3的元素 html代码 div
  • 超实用CSS技巧总结(1)——背景和边框

    文章内容来自CSS神书 CSS揭秘 献上膝盖就好 1 半透明边框 错误的写法 div background color white border 10px solid hsla 0 0 100 5 错误的原因很简单 因为默认情况下 背景是会
  • Base64编解码C源码

    文章目录 一 Base64是什么 二 示例源码 C语言接口 三 可打印字符表 一 Base64是什么 Base64是一种字节码编码方式 主要是基于64个可打印字符来表示二进制数据的方法 详细介绍请参考百度百科 百度百科介绍 二 示例源码 C
  • STMCubeMX+Proteus仿真DHT11(LCD1602显示)

    本文说明 开发工具 STM32CubeMX Keil5 开发芯片 STM32F103R6 采温模块 DHT11 数显屏幕 LCD1602 仿真软件 Proteus 8 12 项目目标 DHT11读取温湿度值 将信息显示在LCD1602上 T
  • 【Rust】002-基础语法:函数

    Rust 002 基础语法 函数 文章目录 Rust 002 基础语法 函数 一 概述 二 函数 1 基本函数 2 参数 3 即时补充 函数参数是 String 和 str 的区别 String str 对比 4 返回值 语句和表达式 语句