Rust 编程视频教程(进阶)——004_2 函数和结构体中的生命周期

视频地址

头条地址:https://www.ixigua.com/i6775861706447913485
B站地址:https://www.bilibili.com/video/av81202308/

讲解内容

1、函数中的泛型生命周期

错误例子:

fn longest(x: &str, y: &str) -> &str {
	if x.len() > y.len() {
		x
	} else {
		y
	}
}

fn main() {
	let s1 = String::from("abcd");
	let s2 = String::from("ad");
	let r = longest(s1.as_str(), s2.as_str());
}

错误原因:rust的借用检查器不知道x和y的生命周期和返回值的生命周期是如何相关联的。

生命周期的语法: ’a
将上述函数修正:

fn longest<’a>(x: &‘a str, y: &’a str) -> &‘a str {
	if x.len() > y.len() {
		x
	} else {
		y
	}
}

//上述函数中,所有的引用拥有相同的生命周期。当不遵守这个规则的参数传入时,检查器就会报错。

2、注意的点
(1)例子:

fn longest<'a>(x: &‘a str, y: &str) -> &‘a str {
	x
}

如果返回值总是x,则不需要为y指定生命周期

(2)当从函数返回一个引用,返回值的生命周期参数需要与一个参数的生命周期参数相匹配。如果返回的引用没有指向任何一个参数,那么唯一的可能就是它指向一个函数内部创建的值,它将会是一个悬垂引用。
错误例子:

fn a_string<'a>(x: & str, y: &str) -> &‘a str {
	let r = String::from("a string");
	r.as_str()//返回悬垂引用,报错
}

3、结构体中的生命周期。包含引用的结构体,需要为结构体定义中添加生命周期注解。

#[derive(Debug)]
struct A<'a> {
	name: &'a str,
}
fn main() {
	let n = String::from("andy");
	let a = A{ name: &n};
	println!("{:#?}", a);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值