Copyright © 2022-2024 aizws.net · 网站版本: v1.2.6·内部版本: v1.23.3·
页面加载耗时 0.00 毫秒·物理内存 62.3MB ·虚拟内存 1300.0MB
欢迎来到 AI 中文社区(简称 AI 中文社),这里是学习交流 AI 人工智能技术的中文社区。 为了更好的体验,本站推荐使用 Chrome 浏览器。
为了让语言的表达方式更人性化,Rust允许函数的签名中省略生命周期。
“生命周期位置”指的是你在类型中可以写生命周期的地方。
&'a T &'a mut T T<'a>
生命周期的位置可以在“输入”也可以在“输出”:
fn
定义的函数,“输入”指的是函数签名中的参数的类型,而“输出”是结果的类型。所以fn foo(s: &str) -> (&str, &str)
省略了一个在输入位置处的生命周期和两个结果位置的生命周期。注意,fn
方法定义中的输入位置不包括impl
头处的生命周期(自然地,对于trait的默认方法,也不包括trait的头的位置)。impl
头位置处的生命周期。省略的规则如下:
&self
或者&mut self
,那么self
的生命周期会赋给所有省略了的输出生命周期。几个例子:
fn print(s: &str); // 省略的 fn print<'a>(s: &'a str); // 完整的 fn debug(lvl: usize, s: &str); // 省略的 fn debug<'a>(lvl: usize, s: &'a str); // 完整的 fn substr(s: &str, until: usize) -> &str; // 省略的 fn substr<'a>(s: &'a str, until: usize) -> &'a str; // 完整的 fn get_str() -> &str; // 错误 fn frob(s: &str, t: &str) -> &str; // 错误 fn get_mut(&mut self) -> &mut T; // 省略的 fn get_mut<'a>(&'a mut self) -> &'a mut T; // 完整的 fn args<T: ToCStr>(&mut self, args: &[T]) -> &mut Command // 省略的 fn args<'a, 'b, T: ToCStr>(&'a mut self, args: &'b [T]) -> &'a mut Command // 完整的 fn new(buf: &mut [u8]) -> BufWriter; // 省略的 fn new<'a>(buf: &'a mut [u8]) -> BufWriter<'a> // 完整的
非安全代码经常会凭空变出来一些引用和生命周期。这些生命周期都是无界的。最常见的场景是解引用一个裸指针,然后产生一个拥有无界生命周期的引用。这些生命周期根据上下文的要求,想要多大就可以有多大。这其实比简单的设为'sta ...