当前位置: 首页 > news >正文

趣味学Rust基础篇(函数)

这一章,我将通过生活化的比喻和例子,帮助各位小伙伴轻松理解 Rust 函数的核心概念,各位读者就当做是看小说一般。


用“菜谱”理解 Rust 函数:从零开始做一道菜

假设你现在是一位非常有名的厨师,而 Rust 的函数(function)就是你的菜谱。每道菜都有名字、步骤、需要的食材(参数),最后做出一道美味的菜(返回值)。咱们就用这个“厨房哲学”来聊聊 Rust 的函数怎么玩。

1. 函数长什么样?—— fn 是你的厨师帽

在 Rust 里,定义一个函数就像戴上厨师帽,喊一声:“我要开始做菜了!”

fn main() {println!("Hello, world!");another_function();
}fn another_function() {println!("Another function.");
}
  • fn 就是“function”的缩写,意思是“我要写个菜谱了”。
  • another_function() 就像喊服务员:“上菜!”——这就是调用函数
  • 函数名用蛇形命名法(snake_case):全小写,单词之间用下划线 _ 连接,比如 make_pizza()wash_dishes(),就像菜名一样清晰。

小知识:main 函数是“主菜”,程序一启动就从它开始,就像餐厅开门第一道招牌菜。


2. 参数:你的“食材清单”

做菜得有食材,函数也一样。这些“食材”就叫参数(parameters)

比如你想做“煎蛋”,但煎几个蛋?用什么油?这些就是参数。

fn main() {fry_eggs(3); // 我要煎 3 个蛋!
}fn fry_eggs(eggs: i32) {println!("煎了 {eggs} 个蛋,香喷喷!");
}
  • eggs: i32 表示“需要一个叫 eggs 的整数(i32)作为食材”。
  • 当你调用 fry_eggs(3)3 就是实参(argument)——真正放进锅里的蛋。

举个栗子:

fn make_coffee(sugar: i32, milk: bool) {println!("加了 {sugar} 勺糖,牛奶:{milk}");
}

调用 make_coffee(2, true),就做出一杯“2 勺糖 + 牛奶”的咖啡。


3. 语句 vs 表达式:指令 vs 计算结果

这是 Rust 最容易搞混的点,但用厨房比喻就秒懂!

语句(Statements):做事,但不返回结果

就像厨房里的“指令”:

  • “把鸡蛋打在碗里” (做了事,但没产出新东西)
  • “把锅烧热”

在代码里:

let x = 6; // 这是一条“指令”:把 6 放进变量 x 的碗里

这是一条语句,它不返回任何值。你不能写:

let y = (let x = 6); //  错!就像说“把‘打蛋’这个动作放进另一个碗”——没意义!

Rust 和 C/Python 不同:赋值不返回值。所以 x = y = 5 在 Rust 里是非法的。

表达式(Expressions):计算,得出一个结果

表达式就像“算账”或“混合食材”:

  • 5 + 6 是表达式,结果是 11
  • fry_eggs(2) 是表达式,结果是“一盘煎蛋”
  • { } 花括号包起来的代码块也是表达式!
let total = {let x = 3;x + 1 // 注意:这里没有分号!
};
// total 的值是 4!因为整个代码块“计算出”了 4

关键区别:

  • 有分号 ; → 语句(不返回值,类型是 (),读作“单元类型”)
  • 无分号 → 表达式(返回值)

4. 返回值:最后端上桌的那道菜

函数可以“做菜”,也可以“上菜”。这个“菜”就是返回值

在 Rust 里,函数默认返回最后一个表达式的值,不需要写 return(除非你想提前退出)。

fn give_me_five() -> i32 {5 // 直接写 5,它就是“菜”,端上桌!
}fn main() {let x = give_me_five(); // x 得到 5println!("x 是 {x}"); // 输出:x 是 5
}
  • -> i32 表示“这道菜是 i32 类型的整数”。
  • 5 是表达式,没有分号,所以它被返回。

错误示范:加了分号就变“语句”,不返回值!

fn plus_one(x: i32) -> i32 {x + 1; // 加了分号,变成语句,返回 (),但函数声明要 i32 → 报错!
}

编译器会说:“你承诺上 i32 的菜,结果端了个空盘子 (),骗子!”

综合实战:做一个“自动售货机”函数

fn vend_snack(money: i32) -> String {if money >= 5 {"薯片一包!".to_string() // 表达式,返回} else {"钱不够,买不起!".to_string()}// 没有分号!整个 if 是表达式,返回其中一个字符串
}fn main() {let snack = vend_snack(10);println!("{snack}"); // 输出:薯片一包!
}

if 语句块本身也可以是表达式!只要里面是表达式且没有分号,就能返回值。


总结:函数就像菜谱

厨房术语Rust 对应例子
菜名函数名 fn make_tea()fn make_tea()
食材参数 water: i32, sugar: i32fn make_tea(water: i32, sugar: i32)
步骤语句 let cup = 0;let cup = 0;
混合调料表达式 sugar + saltsugar + salt
上菜返回值 -> String"茶好了!".to_string()

记住三句话

  1. fn 开头,() 参数,{} 包住菜谱。
  2. 语句做事不返回,表达式计算出结果。
  3. 函数最后一行无分号,默默返回值;加了分号变语句,返回 () 空盘子。
http://www.dtcms.com/a/354829.html

相关文章:

  • ABeam中国 | 中国汽车市场(5)——软件定义汽车(SDV)的智能化应用场景
  • 智能体架构的十字路口:深度剖析Block的“通用平台”与GSK的“垂直模型”
  • 设计模式:组合模式(Composite Pattern)
  • ArcGIS:如何设置地图文档的相对路径或者发布为地图包
  • 5.1 操作系统概述
  • Cesium 入门教程(十一):Camera相机功能展示
  • SplinePSF——应用于光学成像中的 PSF 建模
  • 【贪心 或 DFS - 面试题】小于n最大数
  • 记一次雪花算法 ID 精度丢失的Bug:前端接收到的 Long 被“四舍五入”了?
  • Java HTTP 请求:Unirest 使用指南及与 HttpClient 对比
  • 数据湖与数据仓库
  • 「数据获取」25年最新安徽省路网数据安徽省路网分类数据(获取方式看绑定的资源)
  • 自动化三维测量仪工业零件自动外观三维测量-中科米堆CASAIM
  • 三维视频融合驱动视频孪生创新:智汇云舟引领数字孪生产业新范式
  • Kubernetes一EFK日志架构
  • 在 Ubuntu 24.04 上安装二进制文件(逐步指南)
  • HCIA备考知识点总结:第二章华为VRP系统知识点
  • 嵌入式学习日记(36)TCP并发服务器构建——epoll
  • leetcode算法刷题的第二十天
  • 力扣18:四数之和
  • CodeSouler v2.4.0 版本更新
  • 生成式推荐模型的长序列特征:离线存储
  • 超越文本:深入剖析多模态AI的架构原理
  • c++ 观察者模式 订阅发布架构
  • FFmpeg05:编解码实战
  • 机器学习框架下:金价近3400关口波动,AI量化模型对PCE数据的动态监测与趋势预测
  • 企业通讯软件以安全为基,搭建高效的通讯办公平台
  • RA4M2环境搭建与新建工程
  • 新手向:Python开发简易股票价格追踪器
  • Linux内核IPv4 RAW套接字深度解析:从数据包构造到可靠传输的挑战