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

网站建设旗帜条幅成都房产信息网 官网

网站建设旗帜条幅,成都房产信息网 官网,成都网站建设哪家设计好,响应式企业营销型网站多少钱🦀 Rust 函数通俗入门 📘 Rust 是一门语法精炼但设计严谨的系统级语言。本文围绕函数这一主线,带你真正搞懂 Rust 最关键的语法思想,包括表达式驱动、闭包捕获、Trait 限制、生命周期标注与所有权规则,每遇到一个新概念…

🦀 Rust 函数通俗入门

📘 Rust 是一门语法精炼但设计严谨的系统级语言。本文围绕函数这一主线,带你真正搞懂 Rust 最关键的语法思想,包括表达式驱动、闭包捕获、Trait 限制、生命周期标注与所有权规则,每遇到一个新概念,就在函数中通俗解释清楚。


📑 目录

  1. 函数基础语法:println!、format! 到底是什么?
  2. 什么是表达式驱动语言?Rust 函数为什么不需要 return
  3. 函数参数传递方式:传值、借用、可变借用和所有权规则
  4. 所有权是什么?变量“不能再用”是怎么回事?
  5. 什么是胖类型?为什么 StringVec 会被 move?
  6. 闭包彻底讲解:|| 是什么?为什么有 Fn、FnMut、FnOnce?
  7. 泛型函数:<T> 是什么?什么是 trait 限制?
  8. Trait 是“类型的能力”?PartialOrd 和 Display 是什么?
  9. 隐式调用 trait 方法机制:println! 怎么就能打印我们自定义的类型?
  10. 生命周期:什么时候要加 'a?怎么写、怎么理解?
  11. 总结:写函数前你该先想清楚的三件事

1️⃣ 函数基础语法:println!、format! 到底是什么?

我们从一个简单函数开始:

fn greet(name: &str) -> String {format!("Hi, {}!", name)
}

这个函数接收一个字符串引用 &str,返回一个堆上的字符串(String)。

你会发现:

  • 结尾没有 return,却能返回值
  • format! 的末尾有 !,而不是括号

这就是 Rust 的第一个“神奇”点。

println!format! 为什么有 !

它们不是普通函数,而是宏(macro)。宏在编译期间会被“展开”,是代码生成器。

  • println! 是打印宏
  • format! 是字符串格式构造宏
  • Rust 规定宏名后面必须加 !,和函数区分开
let name = "Tom";
let msg = format!("Hello, {}!", name); // 构造字符串
println!("{}", msg); // 打印字符串

2️⃣ 什么是表达式驱动语言?为什么函数不用写 return

Rust 是“表达式驱动”的语言,也就是说:

你写的很多代码块不仅是“做事”,而是“有值”。

表达式(expression):执行后有返回值
语句(statement):只是执行,不返回值

let x = 5 + 3;       // 表达式
let y = if x > 5 { "big" } else { "small" }; // if 也是表达式

函数体也是表达式:

fn add(a: i32, b: i32) -> i32 {a + b // 最后一行表达式就是返回值
}

📌 如果你加了分号 a + b;,就成了语句,没法返回。


3️⃣ 函数参数传递方式:传值、借用、可变借用

✅ 传值(move)

fn take(val: String) {println!("{}", val);
}let name = String::from("Tom");
take(name);
// println!("{}", name); // ❌ name 已被 move,不能再用

Rust 默认是“所有权转移”,函数接收变量后,调用者就不能再用了。


✅ 借用(&)

fn show(val: &String) {println!("{}", val);
}let s = String::from("Hi");
show(&s);
println!("{}", s); // ✅ 仍然可用

引用就是借用,意味着函数“只看一下”,不拿走。


✅ 可变借用(&mut)

fn append(val: &mut String) {val.push_str("!!!");
}let mut msg = String::from("Hello");
append(&mut msg);
println!("{}", msg); // Hello!!!

Rust 的引用规则:

  • ✅ 多个不可变引用可以并存
  • ✅ 只能有一个可变引用
  • ❌ 不可变和可变不能同时存在

📦 类比:一本书可以被多人看(不可变引用),但只能一个人做笔记(可变引用)。


4️⃣ 所有权是什么?变量不能用了是怎么回事?

Rust 用“所有权”来管理内存,而不是垃圾回收。

fn consume(s: String) {println!("{}", s);
}let x = String::from("Hi");
consume(x);
// println!("{}", x); // ❌ 错:x 的所有权已转移

📦 类比:你把手机送人了,对方拿走,你就不能再用。


5️⃣ 什么是胖类型?为什么 String 和 Vec 会被 move?

Rust 将类型分为两类:

类型是否 Copy示例
轻量类型✅ Copyi32, bool, char
胖类型❌ MoveString, Vec, Box, HashMap

胖类型的特点:

  • 有堆内存(要手动释放)
  • 拷贝开销大,容易造成内存泄漏
  • 默认只能 move

6️⃣ 闭包彻底讲解:|| 是什么?为什么有 Fn、FnMut、FnOnce?

✅ 闭包基本写法

let square = |x: i32| x * x;
println!("{}", square(4)); // 16

语法说明:

  • |x| 是参数
  • 函数体是 x * x
  • 没有 fn,没有名字,随写随用

✅ 把闭包传给函数

fn apply<F>(f: F)
whereF: Fn(i32) -> i32,
{println!("{}", f(5));
}apply(|x| x + 1); // 输出 6

✅ 闭包的三种类型:Fn / FnMut / FnOnce

Rust 根据闭包“如何捕获变量”自动分配三种类型:

类型捕获方式能否调用多次场景
Fn借用(只读)✅ 多次打印
FnMut可变借用✅ 多次修改
FnOnce所有权转移(move)❌ 一次消耗
✅ Fn 示例:
let msg = String::from("hi");
let say = || println!("{}", msg); // 只读
say(); say(); // 可以多次调用
✅ FnMut 示例:
let mut count = 0;
let mut counter = || { count += 1; println!("{}", count); };
counter(); counter(); // 修改 count
✅ FnOnce 示例:
let name = String::from("Tom");
let consume = move || println!("{}", name); // move 进闭包
consume();
// consume(); // ❌ name 被拿走,闭包不能再调用

7️⃣ 泛型函数:<T> 是什么?什么是 trait 限制?

fn max<T: PartialOrd>(a: T, b: T) -> T {if a > b { a } else { b }
}

解释:

  • T 是泛型:可以是任意类型
  • T: PartialOrd 是 Trait 限制:表示 T 必须能比较大小

8️⃣ Trait 是“类型的能力”?PartialOrd 和 Display 是什么?

Trait 就像“接口”,表示一个类型具备某种能力。

fn show<T: std::fmt::Display>(val: T) {println!("{}", val);
}

✅ 为类型实现 Display:

struct Dog;impl std::fmt::Display for Dog {fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {write!(f, "Woof!")}
}println!("{}", Dog); // 输出 Woof!

📦 类比:你告诉 Rust:“我这个类型怎么被打印”,Rust 自动替你处理。


9️⃣ 隐式调用 trait 方法机制

你明明没写 .fmt().to_string(),为啥 println!("{}", dog); 能打印?

这是 Rust 的“隐式 trait 方法调用”机制:

  • 编译器看到 {} 就会查找 Display 实现
  • 找到了就自动调用 fmt()
  • 所以你不需要手动调用 .fmt(),Rust 自动代劳

📦 类比:你下命令“打印”,助理会自动选打印方式。


🔟 生命周期:什么时候要加 'a

Rust 的规则是:返回引用时必须声明生命周期。

fn first<'a>(s: &'a str) -> &'a str {&s[..1]
}

解释:

  • 'a 是生命周期参数
  • 表示“返回值的引用”和“输入引用”活得一样久
  • 防止你返回了“已经销毁的值”

✅ 总结:写函数时你要先想这三件事

问题要考虑的点
参数传递方式move 还是借用?是否可变?
是否用泛型如果是通用函数,需要加 <T> 和 trait 限制
返回引用了吗?如果返回引用,要写生命周期 'a

Rust 的函数不仅仅是“能执行的块”,它是所有权、表达式、类型安全、行为接口等系统的交汇点。理解函数的全过程,也就理解了 Rust 的核心编程方式。


文章转载自:

http://CDRgrwk9.rkwjs.cn
http://bnIqHygs.rkwjs.cn
http://hRMmU0lI.rkwjs.cn
http://FWOfLGwI.rkwjs.cn
http://iXRtven1.rkwjs.cn
http://etNe08ON.rkwjs.cn
http://HrqegEvp.rkwjs.cn
http://pg6wDgNV.rkwjs.cn
http://2rpkZfas.rkwjs.cn
http://ANyRtkJL.rkwjs.cn
http://REmdSLzb.rkwjs.cn
http://mlepULWi.rkwjs.cn
http://I9FjgMvy.rkwjs.cn
http://L5eObJcG.rkwjs.cn
http://TAu6gWta.rkwjs.cn
http://OKbIbgE8.rkwjs.cn
http://9hVEgTiy.rkwjs.cn
http://jrjuvOcw.rkwjs.cn
http://wG7MWZt5.rkwjs.cn
http://n13gXHZv.rkwjs.cn
http://3f8uhJnJ.rkwjs.cn
http://oW4oXofo.rkwjs.cn
http://UBcmTWed.rkwjs.cn
http://3eGhGohO.rkwjs.cn
http://nfwPoBUR.rkwjs.cn
http://sL4v2dfp.rkwjs.cn
http://0jFdfNT2.rkwjs.cn
http://oonz4HGK.rkwjs.cn
http://7CwgsL3e.rkwjs.cn
http://FbUpendt.rkwjs.cn
http://www.dtcms.com/wzjs/681565.html

相关文章:

  • 做网站的基础架构网站建设属于哪个税目
  • 公司没注册可以做网站吗家在坪山业主论坛家在深圳
  • 网站制作容易吗织梦做商城类网站好做吗
  • 盗版电影网站建设成本全网营销推广系统
  • 网站建设 手机开发公司土地评估费计入土地价款
  • 重庆市建设工程信息官方网站wordpress全景主题
  • 如何设计个人网站成都彩蝶花卉网站建设案例
  • app下载网站模板做网站要准备什么资料
  • 亚马逊中国网站建设目标建好网站后访问
  • 有哪些网站可以免费做外销idc网站模板
  • 如何选择免费网站建设腾讯云域名注册
  • 朗朗上口的公司名称长春网站建设方案优化
  • 阿里云网站主体变更怎么做wordpress 百科模板
  • 上海网站哪个比较好网站建设是前端的吗
  • 西宁百姓网天津百度网站快速优化
  • 反恶意镜像网站新会网页制作公司
  • 工程机械网站模板江门网站制作系统
  • 做平台网站一般有php还是js泉州专业网站制作
  • 如何修改网站的关键词wordpress 重装教程视频教程
  • 网站排名软件利搜怎么样图片制作在线
  • 江海区建设局网站网站开发集成软件
  • 网站域名被注册一团网站建设
  • dw做网站注册页代码国外常用的网站开发系统
  • 网站首页制作教程视频wordpress 做公司网站
  • 站长之家0个人建网站wordpress
  • 国外网站都不能上怎么做跨境电商得物网上商城
  • 烟台做网站电话视频嵌入网站
  • 设计师门户网站源码网站建设毕业设计中期进度报告
  • 网页设计模板网站免费下载wordpress 迅雷下载
  • 设计网站物理结构怎么做天津 网站优化