我学东西就是要从最原始最原汁原味的,没有困难也要创造困难处开始啃一遍,因为克服所有困难都是性价比最高的,将来有惨痛教训后再啃,代价太大,(所以先看了英文版的,就是不对照,再看汉语的就飞速了,笔记也是混的,而且体现了初学者的幼稚,第二个笔记就很短了)。反复啃的或每一章做一个词语小结,形成了第一个笔记,以后就看它,不看原来的,由第一个笔记再形成第二个第三个笔记,直到最后只剩一张a4纸。
原来以为不难学,不知不觉做了这么多笔记,还真有点难,因为要想理解透,必须看它的汇编代码,虽然它给你做了一层包装,不看汇编代码心里不踏实。
但是真值得学,它把东邪西毒南帝北丐中神通的各派绝学融合一起公开了(应该是这些大神们私下联结过的),学了一遍后,编了一个千行程序,感谢编译器,改了我十几年的坏习惯,(当时就是冲着缓冲区溢出去的,很多语言的bug),没有护栏的c包括java是很危险,一般都是五年内爆发。
好了,先看第一部分杂编:
1、数据类型推断:i32,f64
2、Tuple.0,tuple.1,
3、struct:you can name each field so it’s clear what the value means…0 ,.1 and …became .name1 ,.name2
the name of a struct type is capitalized.
可以设置类型,只能.index// Tuple struct with data types only
struct Grades(char, char, char, char, f32);
// Classic struct with named fields
struct Student { name: String, level: u8, remote: bool }
// Unit struct
struct Unit;
4、String 和 str 都支持切片,切片的结果是 &str 类型的数据(胖指针:指针加长度。
注意:切片结果必须是引用(不可变内容的指针?)类型,但开发者必须自己明示这一点:所以要有lifetime
let slice = &s[0…3];
有一个快速的办法可以将 String 转换成 &str:
let s1 = String::from(“hello”);let s2 = &s1[…];
其他一些线性数据结构也支持切片操作
&str to string:.to_string() function to make the conversion. In our examples, we use the String::from(&str)
enum:
Like structs, enum variants can have named fields, but they can also have fields without names, or no fields at all.
6、
fn process(s: String) {}
fn main() {
let s = String::from(“Hello, world!”);
process(s.clone()); // Passing another value, cloned from s
.or primitive type
process(s); // s was never moved and so it can still be used.
}
Ownership can’t be transferred for types that implement the Copy trait, such as for simple values like numbers.no default move for primitive type
References allow us to “borrow” values without taking ownership of them.
Your code must implement either of the following definitions, but not both at the same time:
One or more immutable references (&T)
Exactly one mutable reference (&mut T)
error[E0502]: cannot borrow value
as mutable because it is also borrowed as immutable
七rust圣经
If(cfg#(assertion)){
Eprint!(…);
}
2 这和 mut 变量的使用是不同的,第二个 let 生成了完全不同的新变量,两个变量只是恰好拥有同样的名称,涉及一次内存对象的再分配 ,而 mut 声明的变量,可以修改同一个内存地址上的值,并不会发生内存对象的再分配,性能要更好。
有时就是在邻近一行临时用一下变量,就像java里String s=…;如果先用mut定义(分配过内存),这里再let,编译器会帮你检查是否在同一个作用域改变了前一个s值.好习惯!
3 简单工厂模式:
trait Login {
fn verify(&self, name: String, password: String) -> bool;//相当于虚函数
}
enum LoginType {
Domain,
Password,
}
struct DomainLogin {}
impl Login for DomainLogin {
fn verify(&self, name: String, password: String) -> bool {
/**
* do some work
* */
println!(“login via domain”);
true
}
}
struct PasswordLogin {}
impl Login for PasswordLogin {
fn verify(&self, name: String, password: String) -> bool {
/**
* do some work
* */
println!(“login via password”);
true
}
}
struct LoginManager;
impl LoginManager {
fn factory(type_: &LoginType) -> Box {
match type_ {
LoginType::Domain => Box::new(DomainLogin{}),
LoginType::Password => Box::new(PasswordLogin{}),
}
}
}
fn main() {
let login = LoginManager::factory(&LoginType::Domain);
login.verify(“name”.to_string(), “password”.to_string());
let login = LoginManager::factory(&LoginType::Password);
login.verify("name".to_string(), "password".to_string());
}
4、as_ref与&(Borrow)的区别
基础数据类型引用
Borrow可以直接在int, &str, String, vec, [], struct, enum 类型上直接指定&来引用。
as_ref则不行,它需要声明泛型 T:AsRef, T: AsRef, T:AsRef 来支持。相当于另一种类型了
嵌套数据类型引用:Some(&int), Box(&int)
Borrow必须在定义结构时声明 Some<&int>, Box<&int> 才是引用。
as_ref 则直接可以在这些嵌套结构上使用as_ref。
引用的引用
Borrow 引用的引用的表现形式是:&str->&&str
每个crate 有使用说明文档。Cargo 有一个很棒的功能是:运行 cargo doc --open as_ref 引用的引用的表现形式是:&str->&str