panic!宏
Result
enum Result {
Ok(T),
Err(E),
}
struct Point {
x: T,
y: T,
}
enum Option {
Some(T),
None,
}
enum Result {
Ok(T),
Err(E),
}
struct Point {
x: T,
y: T,
}
impl Point {
fn x(&self) -> &T {
&self.x
}
}
pub trait Summarizable {
fn summary(&self) -> String;
}
impl Summarizable for NewsArticle {}
trait 支持默认实现
pub trait Summarizable {
fn summary(&self) -> String {
String::from("(Read more...)")
}
}
对泛型的参数指定 trait bound 限制
pub fn notify(item: T) {
println!("Breaking news! {}", item.summary());
} //在 T 上使用 trait bounds 来指定 item 必须是实现了 Summarizable trait 的类型:
简写
fn some_function(t: T, u: U) -> i32 {}
也可简写为
fn some_function(t: T, u: U) -> i32
where T: Display + Clone,
U: Clone + Debug
{}
例子:
fn longest(x: &str, y: &str) -> &str {
if x.len() > y.len() {
x
} else {
y
}
}//编译不同通过,将会出现有关生命周期的错误,因为传入两个引用,返回一个引用,rust不知道要在函数结束前释放掉哪个变量
指定生命周期:通过注解
1. 生命周期注解并不改变任何引用的生命周期的长短
2. 生命周期注解所做的就是将多个引用的生命周期联系起来。
&i32 // a reference
&'a i32 // a reference with an explicit lifetime
&'a mut i32 // a mutable reference with an explicit lifetime
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
if x.len() > y.len() {
x
} else {
y
}
}// 编译将会通过,函数会返回一个同样也与生命周期 'a 存在的一样长的字符串 slice
struct ImportantExcerpt<'a> {
part: &'a str,
}
impl<'a> ImportantExcerpt<'a> {
fn level(&self) -> i32 {
3
}
}
let s: &'static str = "I have a static lifetime.";
use std::fmt::Display;
fn longest_with_an_announcement<'a, T>(x: &'a str, y: &'a str, ann: T) -> &'a str
where T: Display
{
println!("Announcement! {}", ann);
if x.len() > y.len() {
x
} else {
y
}
}
泛型类型参数意味着代码可以适用于不同的类型。trait 和 trait bounds 保证了即使类型是泛型的,这些类型也会拥有所需要的行为。由生命周期注解所指定的引用生命周期之间的关系保证了这些灵活多变的代码不会出现悬垂引用。而所有的这一切发生在编译时所以不会影响运行时效率