Rust语言入门教程(三) - 函数与模块系统
函数
函数的定义
根据Rust的格式规范,函数名的格式应遵从蛇形命名法,即是用小写字母以及下划线组成,如:
fn do_stuff(){
}
Rust并不要求函数定义的位置必须在调用它之前,所以如果你习惯于把main函数放在最前面的话,是完全没有问题的。
函数的参数格式为参数名: 参数类型, 多个参数之间用,分隔,在参数列表后, 用 ->
指向的类型为函数的返回值类型,花括号内为函数体,格式如下:
fn do_stuff(qty: f64, oz: f64) -> f64{return qty * oz;
}
尾部表达式(tail expression)
上述的返回语句也可以简写为:
fn do_stuff(qty: f64, oz: f64) -> f64{qty * oz
}
如上所示,如果一个语句块的最后一行末尾不写分号的话,那最后一行的表达式的值就会被作为这个语句块的返回值, 语句块的最后一行不带分号的表达式,也被成为尾部表达式(tail expression),例如,下面两个语句块是等价的:
// block A
{return true;}// block B
{true}
如果你需要再某个语句块末尾返回一个值的时候,我们常常习惯于使用尾部表达式,而不是return语句.
Rust中的函数并不支持不定数量的参数,或者不定类型的参数,也就是说,函数定义中,参数的个数及每个参数的类型必须都是明确指定的。要实现这个功能,要用到Rust中的宏(macro), 宏与函数类似,只不过宏的命名总是以一个!结尾, 例如常用的打印宏println!.
函数的调用
Rust中的函数调用与大多数其他编程语言类似, 值得注意的是,调用函数的时候,并不支持指定带参数名称的参数传递,因此传参的时候必须严格遵守函数定义时的顺序:
fn main(){let x = do_stuff(2.0, 12.9);
}fn do_stuff(qty: f64, oz: f64) -> f64{qty * oz
}
模块系统
Rust的模块系统非常强大而且灵活,还是以hello项目为例,我们在src目录下添加一个文件lib.rs, 作为我们的根模块文件。 注意, main.rs是一个特殊的文件,它是程序的入口,是项目的二进制根文件,同时, lib.rs也是一个特殊的文件,它是项目的根模块文件。
在lib.rs中添加如下代码:
fn greet() {println!("Hi!");
}
在main.rs中,我们修改内容如下:
fn main(){hello::greet(); // won't work yet
}
在上面的代码中, 程序会从hello这个库(名称就是我们当前的项目名称hello)中,查找greet函数并执行,上面的代码基本是是没有问题的,但是,Rust的库(Libary)中的所有元素默认都是私有的(private),即使对库本身的其他模块或binary来说,也是如此。为了把greet函数变为公有的,以便在main.rs中可以调用,我们需要在函数定义前加上pub关键字:
pub fn greet() {println!("Hi!");
}
上述方法调用函数时,写的是绝对路径,包含了包名和函数名,如果调用的包层级特别多时,这样书写起来就比较麻烦了。 与其他语言中的import类似, Rust使用use语句导入第三方或自定义模块, 从而可以在代码的上下文中使用模块中定义的元素(函数或变量等), 例如,上述代码可以简化为:
use hello::greet;fn main(){greet(); // won't work yet
}
Rust标准库中定义的函数,我们会经常用到,可以直接使用,而不用作为dependencies添加到配置文件,例如:
use std::collection::Hashmap;
查询这些标准库的使用方法也很容易,只要在Google中搜索关键字即可, 例如要搜索Vector的用法,只要搜rust std vec就会出来想要的结果。如果是一些第三方库,可以在crates.io网站上找到。如果需要使用第三方库,就要在Cargo.toml文件中添加相应的依赖包的信息,例如:
[package]
name = "hello"
version = "0.1.0"
edition = "2021"[dependencies]
rand = "0.8"
其中rand这个第三方库,可以用来帮助我们进行生成随机数等操作,如:
fn main(){let x = rand::thread_rng().gen_range(0, 100);
}
小结
本章介绍了Rust中函数的格式,定义及调用方法。 以及标准库和第三方库的使用。下一章节将介绍Rust中的基本数据类型和流控制语句。
相关文章:
Rust语言入门教程(三) - 函数与模块系统
函数 函数的定义 根据Rust的格式规范,函数名的格式应遵从蛇形命名法,即是用小写字母以及下划线组成,如: fn do_stuff(){ }Rust并不要求函数定义的位置必须在调用它之前,所以如果你习惯于把main函数放在最前面的话&a…...
ubuntu22.04 arrch64版在线安装java环境
脚本 #安装java#!/bin/bashif type -p java; thenecho "Java has been installed."else#2.Installed Java , must install wgetwget -c https://repo.huaweicloud.com/java/jdk/8u151-b12/jdk-8u151-linux-arm64-vfp-hflt.tar.gz;tar -zxvf ./jdk-8u151-linux-arm6…...
概率论与数理统计中常见的随机变量分布律、数学期望、方差及其介绍
1 离散型随机变量 1.1 0-1分布 设随机变量X的所有可能取值为0与1两个值,其分布律为 若分布律如上所示,则称X服从以P为参数的(0-1)分布或两点分布。记作X~ B(1,p) 0-1分布的分布律利用表格法表示为: X01P1-PP 0-1分布的数学期望E(X) 0 *…...
骨传导耳机的优缺点都有哪些?骨传导耳机值得入手吗?
骨传导耳机的优点还是很多的,相比于传统耳机,骨传导耳机要更值得入手! 下面让我们了解下骨传导耳机的优缺点都有哪些: 一、优点 1、使用更安全 传统的耳机,在使用时会听不到外界的声音,而骨传导耳机通过…...
在ASP.NET Core 中使用 .NET Aspire 消息传递组件
前言 云原生应用程序通常需要可扩展的消息传递解决方案,以提供消息队列、主题和订阅等功能。.NET Aspire 组件简化了连接到各种消息传递提供程序(例如 Azure 服务总线)的过程。在本教程中,小编将为大家介绍如何创建一个 ASP.NET …...
NLP学习
参考:NLP发展之路I - 从词袋模型到Transformer - 知乎 (zhihu.com) NLP大致的发展历史。从最开始的词袋模型,到RNN,到Transformers和BERT,再到ChatGPT,NLP经历了一段不断精进的发展道路。数据驱动和不断完善的端到端的…...
Linux-Ubuntu环境下搭建SVN服务器
Linux-Ubuntu环境下搭建SVN服务器 一、背景二、前置工作2.1确定IP地址保持不变2.2关闭防火墙 三、安装SVN服务器四、修改SVN服务器版本库目录五、调整SVN配置5.1查看需要修改的配置文件5.2修改svnserve.conf文件5.3修改passwd文件,添加账号和密码(window…...
python tkinter使用(四)
本篇文章主要讲下tkinter 的文本框相关. tkinter中用Entry来实现输入框,类似于android中的edittext. 具体的用法如下: 1:空白输入框 如下: name tk.Entry(window) name.pack()2: 设置输入框的默认文案 name tk.Entry(window) name.pack() name.insert(tk.END, "请…...
记录ruoyi-plus-vue部署的问题
ruoyi-vue-plus5.x 后端 ruoyi-vue-plus5.x 前端 前端本地启动命令 # 克隆项目 git clone https://gitee.com/JavaLionLi/plus-ui.git# 安装依赖 npm install --registryhttps://registry.npmmirror.com# 启动服务 npm run dev# 构建生产环境 yarn build:prod # 前端访问地址…...
如何在springboot项目中使用minio上传下载删除文件
引入maven依赖 <!-- minio --> <dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.2.2</version> </dependency>申请 bucket | access_key | secret_key 项目中配置相关参数 mini…...
SSM个性化旅游管理系统开发mysql数据库web结构java编程计算机网页源码eclipse项目
一、源码特点 SSM 个性化旅游管理系统是一套完善的信息系统,结合springMVC框架完成本系统,对理解JSP java编程开发语言有帮助系统采用SSM框架(MVC模式开发),系统具有完整的源代码和数据库 ,系统主要采用B…...
4-Docker命令之docker version
1.docker version介绍 docker version命令是用于查看docker容器的版本信息 2.docker version用法 docker version [参数] [root@centos79 ~]# docker version --helpUsage: docker version [OPTIONS]Show the Docker version informationOptions:-f, --format string Fo…...
Redis高并发缓存架构
前言: 针对缓存我们并不陌生,而今天所讲的是使用redis作为缓存工具进行缓存数据。redis缓存是将数据保存在内存中的,而内存的珍贵性是不可否认的。所以在缓存之前,我们需要明确缓存的对象,是否有必要缓存,怎…...
谨防利用Redis未授权访问漏洞入侵服务器
说明: Redis是一个开源的,由C语言编写的高性能NoSQL数据库,因其高性能、可扩展、兼容性强,被各大小互联网公司或个人作为内存型存储组件使用。 但是其中有小部分公司或个人开发者,为了方便调试或忽略了安全风险&#…...
关于一些bug的解决1、el-input的输入无效2、搜索之后发现数据不对3、el多选框、单选框点击无用4、
el-input输入无效 原来的代码是 var test null 但是我发现不能输入任何值 反倒修改test的初始值为123是可以的 于是我确定绑定没问题 就是修改的问题 于是改成 var test ref() v-model绑定的值改成test.value就可以了 因为ref是相应式的 可以通过输入…...
使用 JavaScript 进行 API 测试的综合教程
说明 API 测试是软件测试的一种形式,涉及直接测试 API 并作为集成测试的一部分,以确定它们是否满足功能、可靠性、性能和安全性的预期。 先决条件: JavaScript 基础知识。Node.js 安装在您的计算机上。如果没有,请在此处下载。npm…...
Vue 2.0源码分析-Virtual DOM
Virtual DOM 这个概念相信大部分人都不会陌生,它产生的前提是浏览器中的 DOM 是很“昂贵"的,为了更直观的感受,我们可以简单的把一个简单的 div 元素的属性都打印出来,如图所示: 可以看到,真正的 DOM …...
(HAL库版)freeRTOS移植STMF103
正点原子关于freeRTOS的教程是比较好的,可惜移植的是标准库,但是我学的是Hal库,因为开发速度更快,从最后那个修改SYSTEM文件夹的地方开始替换为下面的内容就可以了 5.修改Systick中断、SVC中断、PendSV中断 将SVC中断、P…...
vue2-axios
下载axios 开发版本:axios.js 生产版本:axios.min.js 搭建服务器:json-server npm i -g json-serverjson-server --watch db.json(启动服务并读取文件,db.json文件目录下启动) json-server --watch db.j…...
创建maven的web项目
(一)创建maven的web项目 Step1、创建一个普通的maven项目 (1)新建一个empty project,命名为SSM2。 点击项目名,右键new,选择Module,左侧选择“Maven archetype”,可以给…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
Python 高级应用10:在python 大型项目中 FastAPI 和 Django 的相互配合
无论是python,或者java 的大型项目中,都会涉及到 自身平台微服务之间的相互调用,以及和第三发平台的 接口对接,那在python 中是怎么实现的呢? 在 Python Web 开发中,FastAPI 和 Django 是两个重要但定位不…...
GC1808:高性能音频ADC的卓越之选
在音频处理领域,高质量的音频模数转换器(ADC)是实现精准音频数字化的关键。GC1808,一款96kHz、24bit立体声音频ADC,以其卓越的性能和高性价比脱颖而出,成为众多音频设备制造商的理想选择。 GC1808集成了64倍…...
