rustp-6.结构体、函数生命周期基础
基础生命周期的介绍
12345678910111213141516171819202122//1.Rust中每一个引用都有生命周期,也就是引用保持有效的作用域,大部分时候生命周//期是隐含并可以推断的,正如大部分时候类型可以推断一样//2.生命周期的主要目标是避免悬垂引用//3.Rust编译器使用借用检查器来检查生命周期是否有效//因为生命周期和借用,以及引用有关//4.生命周期常常伴随着str使用//错误示例fn main() { let r; { let x = 5; r = &x; } //x被droped但是仍然在使用 //会造成悬垂引用,但是rust的编译器会阻止这种行为 println!("r = {}",r); }//---------------------------
函数中的生命周期
1234567891011121314151617181920212223242526272829303132333435 ...
rustp-5.对任何实现特定trait类型有条件的实现trait
123456789101112131415161718192021222324252627282930//对任何实现特定trait类型有条件的实现traittrait GetName { fn get_name(&self) -> &String; }trait PrintName { fn print_name(&self); }//对泛型T实现了PrintName特征,前提是T实现了GetName//有点类似继承impl<T:GetName> PrintName for T { fn print_name(&self) { println!("name = {}",self.get_name()); } }struct Student { name: String, }impl GetName for Student { ...
rustp-4.有条件的实现方法
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758//使用trait bound有条件的实现方法trait GetName { fn get_name(&self) -> &String; }trait GetAge { fn get_age(&self) -> u32; }struct PeopleMatchInformation<T,U> { master: T, employee: U, }impl<T:GetName+GetAge,U:GetName+GetAge> PeopleMatchInformation<T,U> { fn print_all_information (&self) { print ...
rustp-3.trait-bound语法糖
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394#[derive(Debug)]//1.trait-bound//2.指定多个trait trait-bound//3.返回 trait的类型fn print_information(item: impl GetInformation) { //这里只关心是否实现impl trait,然后调用item实现的方法即可 println!("name = {}",item.get_name()); println!("age = {}",item.get_age()); }//4. 使用trait bound语法糖将函数参数使用tra ...
rustp-3.trait
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273//1.trait定义与其他类型共享的功能,类似其他语言的接口//(1)可以通过trait以抽象的方式定义共享的行为// (2) 可以使用trait bounds指定泛型是任何拥有特定行为的类型//2. 定义trait//3. 实现trait//4. 默认实现: 可以在定义trait的时候提供默认的行为,trait的类型可以使用默认的行为.//5. trait作为参数//2.pub trait GetInformation { fn get_name(&self) -> &String; fn get_age(&self) -> u32; }trait SchoolName { fn get_school_name(&sel ...
rustp-2.结构体更高级别和方法使用泛型
结构体中使用泛型
1234567891011//结构体中使用不同的泛型#[derive(Debug)]struct Point<T,U> { x: T, y: U, }fn main() { let a = Point{x:1.1,y:'a'}; println!("{:?}",a); }
枚举中使用泛型
123456789enum Option<T> { Some(T), None, }enum Result<T,E> { Ok(T), Err(E), }
方法中使用泛型
123456789101112131415161718192021222324252627282930313233343536373839# [derive(Debug)]struct Point<T> { x:T, y:T, ...
arch遇到更新安装失败:无效或已损坏的软件包
有时候使用arch的时候,会遇到arch 更新安装已损坏,(无效或者已经损坏的签名包)
这个时候只需要对arch的keyring进行更新即可,因为这种情况一般出现在长时间未更新
1sudo pacman -S archlinux-keyring && sudo pacman -Syu
通常情况下也会遇到Arch缓存过多的情况,此时需要使用以下命令:
1234paccache -r # 清理缓存,仅包含最近的三个版本paccache -rk1 # 清理缓存,仅包含最近的1个版本pacman -Sc # 清理未安装软件包pacman -Scc # 清理缓存中所有内容
rustp-1.函数和结构体的泛型
没有泛型
1234567891011121314151617181920212223242526272829303132333435363738394041//1.泛型是具体类型或者其他属性的抽象替代,用于减少代码重复//2.在函数定义中使用泛型//3.在结构体中使用泛型//4.枚举中的泛型//5.方法中的泛型//6.总结:使用泛型并不会造成程序性能上的损失,rust通过编译时进行泛型代码的单态化//来保证效率,单态化时通过填充编译时使用到具体类型,将通用代码转化为特定代码//没有泛型的时候//for i32 //使用slice: i32类型fn largest_i32(list: &[i32]) -> i32 { let mut largest = list[0]; for &item in list.iter() { if item > largest { largest = item; } } largest ...
rust20.测试
测试只有在lib中能够使用(cargo root lib)
1234567891011121314151617//mylib/src/animal.rspub mod Dog { pub fn hello () { println!("wangwang"); } pub fn is_dog() -> bool { true } }pub mod Cat { pub fn hello () { println!("miaomiao"); } pub is_cat() -> bool { true } }
123456789101112131415161718192021//mylib/src/lib.rspub mod animal;#[cfg(test)]mod tests { u ...
rust19.错误
123456789101112131415161718192021222324252627282930313233//1.rust将错误类型分为两个类别:可恢复错误和不可恢复错误//(1) 可恢复错误通常代表向用户报告错误和重试操作是合理的情况,如未找到文件。//rust使用Result<T,E>来实现//(2) 不可恢复错误是bug的同义词,如尝试访问超过数组结尾的位置。rust中通过panic!//来实现//2. panic!//3.使用BACKTRACE = 1//4.Result<T,E>//5.简写//6. 当编写一个函数,但是函数可能会失败,此时除了在函数中处理错误之外,还可以//将错误传递给调用者,让调用者处理,称为传播错误//7.传播错误的简写方式//8. 更进一步简写//9.什么时候用panic,什么时候用Result//(1)示例,代码原型、测试使用panic!\unwrap\expect//(2)实际项目中使用Result//10.Option和Result//为空使用Option,为错误使用Result// 2.fn main() ...