Rust从入门到精通之入门篇:3.Hello World

Hello World

学习目标

完成本章学习后,你将能够:

  • 创建并运行第一个 Rust 程序
  • 理解 Rust 程序的基本结构
  • 使用 Cargo 管理 Rust 项目
  • 了解 Rust 的编译和执行过程
  • 编写简单的 Rust 代码并添加注释

在本章中,我们将创建并运行第一个 Rust 程序。通过这个简单的例子,你将了解 Rust 程序的基本结构和工作流程。

创建第一个 Rust 程序

使用 Cargo 创建项目

最简单的方法是使用 Cargo 创建一个新项目:

cargo new hello_world
cd hello_world

Cargo 会为你创建一个基本的项目结构:

hello_world/
├── Cargo.toml      # 项目配置文件
└── src/└── main.rs     # 主源代码文件

查看生成的代码

打开 src/main.rs 文件,你会看到 Cargo 已经为你生成了一个简单的 “Hello, world!” 程序:

fn main() {println!("Hello, world!");
}

让我们分析这段代码:

  1. fn main() { ... } 定义了一个名为 main 的函数,这是 Rust 程序的入口点。
  2. println!("Hello, world!"); 是一个宏调用,用于在控制台打印文本。
  3. 注意行尾的分号 ;,在 Rust 中,大多数语句都以分号结束。

运行 Hello World 程序

使用 Cargo 运行

在项目目录中,运行以下命令:

cargo run

Cargo 会编译并运行你的程序,你应该会看到输出:

Hello, world!

编译过程发生了什么?

当你运行 cargo run 时,Cargo 执行以下步骤:

  1. 编译你的代码及其依赖项
  2. 生成一个可执行文件(在 target/debug/ 目录中)
  3. 运行该可执行文件

你也可以分别执行这些步骤:

# 仅编译
cargo build# 运行编译后的可执行文件
./target/debug/hello_world  # 在 Unix 系统上
target\debug\hello_world.exe  # 在 Windows 上

修改 Hello World 程序

让我们稍微修改一下程序,使其更加个性化:

fn main() {let name = "Rustacean";println!("Hello, {}!", name);println!("Welcome to the world of Rust programming.");
}

这个修改后的程序引入了几个新概念:

  1. let name = "Rustacean"; 声明了一个变量 name 并赋值为字符串 “Rustacean”。
  2. println!("Hello, {}!", name); 使用了格式化字符串,其中 {} 是一个占位符,会被 name 的值替换。

保存文件并再次运行:

cargo run

你应该会看到:

Hello, Rustacean!
Welcome to the world of Rust programming.

添加注释

Rust 支持多种注释风格:

// 这是一个单行注释/* 这是一个多行注释 *//// 这是文档注释,用于生成文档
/// 它支持 Markdown 格式//! 这是模块级文档注释,通常用在文件开头

让我们在我们的程序中添加一些注释:

// hello_world.rs - 我的第一个 Rust 程序fn main() {// 声明一个变量并赋值let name = "Rustacean";// 使用格式化打印println!("Hello, {}!", name);// 打印欢迎消息println!("Welcome to the world of Rust programming.");
}

理解 Rust 程序结构

main 函数

每个 Rust 可执行程序都必须有一个 main 函数,它是程序的入口点。函数定义以 fn 关键字开始,后跟函数名和一对圆括号,然后是函数体,用花括号 {} 包围。

语句和表达式

Rust 中的代码由语句和表达式组成:

  • 语句:执行某些操作但不返回值的指令,通常以分号结束。
  • 表达式:计算并返回值的代码片段,不以分号结束(如果加上分号,它就变成了一个语句)。

println! 是一个宏,而不是函数。Rust 中的宏以感叹号结尾,它们在编译时展开为更复杂的代码。宏提供了比函数更强大的元编程能力。

示例程序

让我们创建一个稍微复杂一点的 Hello World 程序,展示更多 Rust 的基本特性:

// hello_advanced.rs - 一个增强版的 Hello World 程序fn main() {// 使用变量存储名字let name = "Rustacean";// 使用格式化打印println!("Hello, {}!", name);// 使用多个参数let language = "Rust";let year = 2023;println!("Welcome to {} programming in {}!", language, year);// 使用不同的格式化选项println!("十进制: {}, 十六进制: {:x}, 二进制: {:b}", 42, 42, 42);// 使用命名参数println!("{language} is {adjective}!", language="Rust", adjective="awesome");
}

总结

在本章中,我们学习了:

  • 如何使用 Cargo 创建新的 Rust 项目
  • Rust 程序的基本结构和 main 函数
  • 如何编译和运行 Rust 程序
  • 使用 println! 宏输出信息
  • Rust 中的基本注释类型
  • 语句和表达式的区别

现在你已经成功运行了你的第一个 Rust 程序,并了解了其基本结构。在下一章中,我们将深入学习 Rust 的变量系统和数据类型,这是理解 Rust 编程的基础。

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

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

相关文章

深度解析Spring Boot可执行JAR的构建与启动机制

一、Spring Boot应用打包架构演进 1.1 传统JAR包与Fat JAR对比 传统Java应用的JAR包在依赖管理上存在明显短板,依赖项需要单独配置classpath。Spring Boot创新的Fat JAR(又称Uber JAR)解决方案通过spring-boot-maven-plugin插件实现了"…

deepseek(2)——deepseek 关键技术

1 Multi-Head Latent Attention (MLA) MLA的核心在于通过低秩联合压缩来减少注意力键(keys)和值(values)在推理过程中的缓存,从而提高推理效率: c t K V W D K V h t c_t^{KV} W^{DKV}h_t ctKV​WDKVht​…

突破反爬困境:SDK架构设计,为什么选择独立服务模式(四)

声明 本文所讨论的内容及技术均纯属学术交流与技术研究目的,旨在探讨和总结互联网数据流动、前后端技术架构及安全防御中的技术演进。文中提及的各类技术手段和策略均仅供技术人员在合法与合规的前提下进行研究、学习与防御测试之用。 作者不支持亦不鼓励任何未经授…

自然语言处理,能否成为人工智能与人类语言完美交互的答案?

自然语言处理(NLP)作为人工智能关键领域,正深刻改变着人机交互模式。其发展历经从早期基于规则与统计,到如今借深度学习实现飞跃的历程。NLP 涵盖分词、词性标注、语义理解等多元基础任务,运用传统机器学习与前沿深度学…

蓝桥杯备考:八皇后问题

八皇后的意思是&#xff0c;每行只能有一个&#xff0c;每个对角线只能有一个&#xff0c;每一列只能有一个&#xff0c;我们可以dfs遍历每种情况&#xff0c;每行填一个&#xff0c;通过对角线和列的限制来进行剪枝 话不多说&#xff0c;我们来实现一下代码 #include <ios…

HDR(HDR10/ HLG),SDR

以下是HDR&#xff08;HDR10/HLG&#xff09;和SDR的详细解释&#xff1a; 1. SDR&#xff08;Standard Dynamic Range&#xff0c;标准动态范围&#xff09; • 定义&#xff1a;SDR是传统的动态范围标准&#xff0c;主要用于8位色深的视频显示&#xff0c;动态范围较窄&…

【MySQL】验证账户权限

在用户进行验证之后&#xff0c;MySQL将提出以下问题验证账户权限&#xff1a; 1.谁是当前用户&#xff1f; 2.该用户有何权限&#xff1f; 管理权限比如&#xff1a;shutdown、replication slave、load data infile。数据权限比如&#xff1a;select、insert、update、dele…

通过TIM+DMA Burst 实现STM32输出变频且不同脉冲数量的PWM波形

Burst介绍&#xff1a; DMA控制器可以生成单次传输或增量突发传输&#xff0c;传输的节拍数为4、8或16。 为了确保数据一致性&#xff0c;构成突发传输的每组传输都是不可分割的&#xff1a;AHB传输被锁定&#xff0c;AHB总线矩阵的仲裁器在突发传输序列期间不会撤销DMA主设备…

GaussDB数据库表设计与性能优化实践

GaussDB分布式数据库表设计与性能优化实践 引言 在金融、电信、物联网等大数据场景下&#xff0c;GaussDB作为华为推出的高性能分布式数据库&#xff0c;凭借其创新的架构设计和智能优化能力&#xff0c;已成为企业核心业务系统的重要选择。本文深入探讨GaussDB分布式架构下的…

npm install 卡在创建项目:sill idealTree buildDeps

参考&#xff1a; https://blog.csdn.net/PengXing_Huang/article/details/136460133 或者再执行 npm install -g cnpm --registryhttps://registry.npm.taobao.org 或者换梯子

【MySQL】从零开始:掌握MySQL数据库的核心概念(五)

由于我的无知&#xff0c;我对生存方式只有一个非常普通的信条&#xff1a;不许后悔。 前言 这是我自己学习mysql数据库的第五篇博客总结。后期我会继续把mysql数据库学习笔记开源至博客上。 上一期笔记是关于mysql数据库的增删查改&#xff0c;没看的同学可以过去看看&#xf…

抖音矩阵系统源码开发与部署技巧!短视频矩阵源码搭建部署

在短视频蓬勃发展的时代&#xff0c;短视频矩阵已成为内容创作者和企业扩大影响力、提升传播效果的重要策略。而一个高效、易用的前端系统对于短视频矩阵的成功运营至关重要。本文将深入探讨短视频矩阵前端源码搭建的技术细节&#xff0c;为开发者提供全面的技术指导。 一、技…

ESP32S3 WIFI 实现TCP服务器和静态IP

一、 TCP服务器代码 代码由station_example_main的官方例程修改 /* WiFi station ExampleThis example code is in the Public Domain (or CC0 licensed, at your option.)Unless required by applicable law or agreed to in writing, thissoftware is distributed on an &q…

物质与空:边界中的确定性,虚无中的无限可能——跨学科视角下的存在本质探析

一、哲学框架&#xff1a;二元性与超越性 1. 物质的边界性&#xff1a;有限世界的确定性法则 在人类认知的起点&#xff0c;物质以"非0即1"的绝对姿态显现。一块石头、一滴水、乃至微观粒子&#xff0c;都以明确的边界定义自身存在。这种确定性映射着&#xff1a; 亚…

linux常用指令(10)

那么我们就继续来学习linux指令的使用,来了解搜索查找类的相关指令,话不多说,来看. 搜索查找类 1.find指令 find将从指定目录向下遍历其各个子目录,将满足条件的条件或目录显示在终端 基本语法 find[搜索范围][项项] 选项说明 -name<查询方式> 按照指定的文件名查找…

AWTK-WEB 快速入门(6) - JS WebSocket 应用程序

WebSocket 可以实现双向通信&#xff0c;适合实时通信场景。本文介绍一下使用 Javacript 语言开发 AWTK-WEB 应用程序&#xff0c;并用 WebSocket 与服务器通讯。 用 AWTK Designer 新建一个应用程序 先安装 AWTK Designer&#xff1a; https://awtk.zlg.cn/web/index.html …

机器学习——集成学习框架(GBDT、XGBoost、LightGBM、CatBoost)、调参方法

一、集成学习框架 对训练样本较少的结构化数据领域&#xff0c;Boosting算法仍然是常用项 XGBoost、CatBoost和LightGBM都是以决策树为基础的集成学习框架 三个学习框架的发展是&#xff1a;XGBoost是在GBDT的基础上优化而来&#xff0c;CatBoost和LightGBM是在XGBoost的基础上…

Leetcode 最长递增子序列的个数

java solution class Solution {public int findNumberOfLIS(int[] nums) {//边界情况处理int n nums.length;if(n < 1) return n;//然后我们创建2个数组, 分别是count数组和length数组,//length[i]的含义是以i结尾的子数组的最长递增子序列长度//count[i]的含义是以i结尾…

原型验证后客户推翻原有需求,如何止损

原型验证后客户推翻原有需求时止损的有效方法包括&#xff1a;迅速评估影响范围、立即开展沟通确认、调整项目计划和资源配置、更新变更管理流程、协商成本分担机制。其中&#xff0c;迅速评估影响范围是关键&#xff0c;项目团队必须立即明确此次变更的具体影响&#xff0c;包…

在rockylinux9.4安装mongodb报错:缺少:libcrypto.so.10文件库

问题点&#xff1a; rockylinux9.4系统环境报错&#xff1a; ./mongod: error while loading shared libraries: libcrypto.so.10: cannot open shared object file: No such file or directory 解决方法&#xff1a; Ps&#xff1a;解压之后&#xff0c;检查mongodb的依赖环境…