想建立自己的网站,中文域名注册报价表,手机端网站html好看的模板,如何在百度上发表文章前言
你怎么向天生的瞎子说清颜色#xff1f;怎么用手势向天生的聋子描述声音#xff1f; 鲜花就在眼前#xff0c;雷鸣就在头顶#xff0c;对他们来说却都毫无意义 眼睛看不到#xff0c;鼻子可以嗅闻花香#xff0c;耳朵听不见#xff0c;手指可以触碰窗纸的震动。 犯…前言
你怎么向天生的瞎子说清颜色怎么用手势向天生的聋子描述声音 鲜花就在眼前雷鸣就在头顶对他们来说却都毫无意义 眼睛看不到鼻子可以嗅闻花香耳朵听不见手指可以触碰窗纸的震动。 犯错的可能是描述者而不是瞎子和聋子你明知道他们无法领会颜色与声音为什么非要生硬地灌输呢换一种方法用他们能理解的方式同样能传递信息。——《拔魔》 \;\\\;\\\; 目录 前言借用生命周期闭包 借用
借用borrow很像是引用reference也就是地址。但是有限制不能借用多次即不能借用完了还当借用在自己这
fn main() {let mut s String::from(hello);let a mut s;let b mut s; //不安全报错怎么能把可变的借用给两个IDprintln!({}, {}, a, b);
}\;\\\;\\\;
生命周期
fn main() {// let r;// {// let a 5;// r a;// }// println!(r{}, r); //报错因为a被回收了let r;{let a 5;ra; //这样就没错了因为这里是拷贝了一份}println!(r{},r);} fn main() {let smax(hola,hello);println!(s{},s);
}//fn max(x:str,y:str)-str{ //报错因为没指明两个参数的作用域
fn maxa(x:a str,y:a str)-a str{if x.len() y.len(){x}else{y}
}a 进行声明周期标注比如 static 就是标注为全局静态。
fn main() {let aString::from(hola);{let bString::from(hello);}println!(max is {},max(a,b)); //报错b被回收了
}fn maxa(x:a str,y:a str)-a str{if x.len() y.len(){x}else{y}
}#[derive(Debug)]
struct MyPacka {part: a str,
// tally:b str,
}fn main() {let i;{let a: String String::from(test... i. t..); //待分割的字符串let b: str a.split(.).next().expect(not find .);i MyPack { part: b };}println!(part : {:?},, i); //错误因为b被释放了
} \;\\\;\\\;
#[derive(Debug)]
struct Foo;impl Foo{//传入可变借用传出不可变借用没有mut//就是把可变借用转化为了不可变借用fn exec(mut self)-Self{*self //取星号是为了和传入的抵消不然self就变成了地址的地址了}fn run(self){println!(2);}
}fn main(){let mut f : Foo Foo;//f是可变的f.run(); //f是可变的let a : Foo f.exec(); //a是可变的f借用给了a所以下面f调用就出错了// println!({:?},a); //Foof.run(); //只要后面有打印就报错//println!({:?},a); //Foo f.run()后面没有这句打印就没错了println!(---------------------);{let mut b : Foo Foo;//b是可变的{b.run();let c : Foo b.exec(); //c也是不可变的{//b.exec();//b.run();//c.exec();c.run(); //不可变的c可以调用run}println!({:?},c);}}
}#[derive(Debug)]
struct Foo;impl Foo{fn exec(mut self)-mut Self{mut *self }fn run(self){println!(2);}
}fn main(){{let mut b : Foo Foo;//b是可变的{b.run();let c : mut Foo b.exec(); //c是可变的{//b.exec();//b.run();c.exec();c.run(); }println!({:?},c);}}
}\;\\\;\\\;
闭包
就是lambda表达式也是匿名函数
fn main(){let x:f64100f64;let add |y:f64| xy ; //闭包let sub |y| -i64 { (x-y) as i64 };let one ||1;println!(add : {},add(20f64));println!(sub : {},sub(20f64));println!(one : {},one());
}struct CacheT
where T: Fn(u32) - u32,{ //泛型定义//query和value都是函数query: T,value: Optionu32,
}//实现类
implT CacheT
where T: Fn(u32) - u32,{//生成实例fn new(query: T) - CacheT{Cache { query, value : None}}//取值fn value(mut self, arg: u32)-u32{match self.value{//有这个值就直接返回Some(v) v, //如果没有传入value那么就取argNone{let v (self.query)(arg); self.value Some(v);v}}}
}fn main() {let mut c Cache::new(|x|x10); println!(value is {},c.value(90));
} \;\\\;\\\;