You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
fn main() {
let string1 = String::from("long string is long");
{
let string2 = String::from("xyz");
let result = longest(string1.as_str(), string2.as_str());
println!("The longest string is {}", result);
}
}
正确输出 "long string is long"
bad case
fn main() {
let string1 = String::from("long string is long");
let result;
{
let string2 = String::from("xyz");
result = longest(string1.as_str(), string2.as_str());
}
println!("The longest string is {}", result);
}
result 的生命周期和 string2 一致(string2 的生命周期比 string1短),所以函数返回是寿命最短的那个
fn longest<'a>(x: &str, y: &str) -> &'a str {
let aa = String::from("really long string");
aa.as_str()
}
aa 在 函数执行完毕后就被清空了,而我们尝试从函数返回一个 aa 的引用
无法指定生命周期参数来改变悬垂引用
最好的解决方案是返回一个有所有权的数据类型而不是一个引用,这样函数调用者就需要负责清理这个值了
fn longest() -> str {
let aa = String::from("really long string");
aa.as_str() // 返回非引用的值
}
结构体中使用生命周期注解
struct ImportantExcerpt<'a> {
part: &'a str,
}
fn main() {
let novel = String::from("Call me Ishmael. Some years ago...");
let first_sentence = novel.split('.').next().expect("Could not find a '.'");
let i = ImportantExcerpt {
part: first_sentence,
};
}
泛型
泛型,为了消除重复
泛型并不会使程序比具体类型运行的慢
Rust
通过在编译时进行泛型代码的 单态化(monomorphization)来保证效率。单态化是一个通过填充编译时使用的具体类型,将通用代码转换为特定代码的过程。
泛型没运行时开销
Trait:定义共同行为
类似于
Java
里的 接口 (interface)aggregator 库
引用
默认行为
trait 作为参数
生命周期
会报错,
x
在离开作用域时就会销毁,外部不能在使用其引用了函数中的泛型生命周期
以上代码会报错,报错原因是
longest
return 了一个借来的值,但是函数签名没有明确借的是x
还是y
确实,
longest
函数x
还是y
,只有在运行时才能确定为解决以上问题,可使用泛型生命周期参数来定义引用间的关系,以便借用检查器可以进行分析
生命周期注解并不改变任何引用的生命周期的长短
相反它们描述了多个引用生命周期相互的关系,而不影响其生命周期
基本语法:以撇号(
'
)开头单个的生命周期注解本身没有多少意义,因为生命周期注解告诉 Rust 多个引用的泛型生命周期参数如何相互联系的
例如如果函数有一个生命周期
'a
的i32
的引用的参数first
。还有另一个同样是生命周期'a
的i32
的引用的参数second
。这两个生命周期注解意味着引用first
和second
必须与这泛型生命周期存在得一样久eg:
两个参数,他们都是与生命周期
'a
存在一样长的字符串 slice,返回一个同样与生命周期'a
一样长的字符串 slice实际含义是
longest
函数返回的引用的生命周期 与 参数引用的值的生命周期的较小者一致参数
x
和y
哪个生命周期短,返回值的生命长度和其保持一致生命周期注解只会出现在函数签名中,而不存在于函数体中的任何代码中
让函数签名包含生命周期约定意味着 Rust 编译器的工作变的更简单了
eg:
正确输出 "long string is long"
bad case
result
的生命周期和string2
一致(string2
的生命周期比string1
短),所以函数返回是寿命最短的那个如果函数总是返回第一个参数,如上代码,则必须指定 参数
x
和返回值注解,否则会报错如果返回一个新生成的变量,即便指定生命周期,也会编译失败
aa
在 函数执行完毕后就被清空了,而我们尝试从函数返回一个aa
的引用无法指定生命周期参数来改变悬垂引用
最好的解决方案是返回一个有所有权的数据类型而不是一个引用,这样函数调用者就需要负责清理这个值了
结构体中使用生命周期注解
生命周期消除
RAII 的思想是:资源的有效期与持有资源的对象的生命期严格绑定,即由对象的构造函数完成资源的分配,同时由析构函数完成资源的释放。在这种要求下,只要对象能正确的析构,就不会出现资源泄露问题。
The text was updated successfully, but these errors were encountered: