Skip to content

Latest commit

 

History

History
121 lines (61 loc) · 2.55 KB

0709.md

File metadata and controls

121 lines (61 loc) · 2.55 KB

07/09

我已经无法表达自己的愧疚之情了,但是由于一直卡壳,我今天依然在做rustlings,但是每天收获都挺大的。所以我做了这么一个决定,以后实时记录每天工作,并只做符合自己当前水平的计划。

对trait的理解:

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。。。。请看图:

image-20200709210838458

key,value同名的时候,直接赋值了有木有,所以懂得都懂了。emmmmm。

如果你不这么搞,编译器其实还不乐意了:

image-20200709210954004

所以如果觉得结构体赋值很麻烦,将想要赋值的变量名刚好和结构体的元素名相同,不失为一个偷懒的好办法。