我已经无法表达自己的愧疚之情了,但是由于一直卡壳,我今天依然在做rustlings,但是每天收获都挺大的。所以我做了这么一个决定,以后实时记录每天工作,并只做符合自己当前水平的计划。
pub trait Summary {
fn summarize(&self) -> String;
}
trait像是一个注册表,里面包含了各种各样的方法,各个结构体注册符合语法规则的trait中的各种方法。
pub struct NewsArticle {
pub headline: String,
pub location: String,
pub author: String,
pub content: String,
}
impl Summary for NewsArticle {
fn summarize(&self) -> String {
format!("{}, by {} ({})", self.headline, self.author, self.location)
}
}
pub struct Tweet {
pub username: String,
pub content: String,
pub reply: bool,
pub retweet: bool,
}
impl Summary for Tweet {
fn summarize(&self) -> String {
format!("{}: {}", self.username, self.content)
}
}
如上图,通过注册,结构体Tweet和NewArticle也都获得了方法summarize()。
**** 看起来好像卵用没有(刚开始学的时候我也是这么认为的),but,注册了同种trait的元素便拥有了相同的调用方法,从而在多种泛型中凸显出来。****
它可能是这样
pub fn notify(item: impl Summary) {
println!("Breaking news! {}", item.summarize());
}
也可能是这样:
pub fn notify<T: Summary>(item1: T, item2: T) {
但是他们都有着相同的含义,只有在Summary中注册过的结构,才有资格成为函数的参数。因此,只要在函数参数中为trait类型做声明,就可以让泛型只包含一部分符合条件的数据类型。
rust结构体其实赋值挺恶心的,非得
Point{
x:1,
y:2,
z:3,
}
全然没有C++直接赋值的爽感,but。。。。请看图:
key,value同名的时候,直接赋值了有木有,所以懂得都懂了。emmmmm。
如果你不这么搞,编译器其实还不乐意了:
所以如果觉得结构体赋值很麻烦,将想要赋值的变量名刚好和结构体的元素名相同,不失为一个偷懒的好办法。