一、所有权的定义
降低编译速度,检查规则
二、所有权的规则 内存与分配
fn main() {
let mut s = String::from("hello");
s.push_str(",World");
println!("{}",s)
}
类似于Java中的StringBuilder和StringBuffer
fn main() {
let s1 = String::from("Hello");
let s2 = s1.clone();
println!("{} {}",s1,s2);
}
数据完成了复制
三、所有权与函数
fn main() {
let s = String::from("hello world");
take_ownership(s);
let x = 5;
makes_copy(x);
println!("{}",x)
}
fn take_ownership(param:String) {
println!("{}",param);
}
fn makes_copy(num:i32) {
println!("{}",num);
}
字符串String是传引用,变量x是传值
四、引用和借用
fn main() {
let s1 = String::from("hello");
let len = calculate_len(&s1);
print!("length:{}",len);
}
fn calculate_len(s:&String) -> usize {
s.len()
}
使用可变引用即可
类似于读写锁一样的原理,读锁之间是共享的,但是读和写锁之间是互斥
五、切片
fn main() {
let mut s = String::from("Hello world");
let wordIndex = first_word(&s);
println!("{}",wordIndex);
}
fn first_word(s:&String) -> usize {
let bytes = s.as_bytes();
for (i,&item) in bytes.iter().enumerate() {
if item == b' ' {
return i;
}
}
return s.len()
}
fn main() {
let s = String::from("Hello,world");
/*let s1 = &s[0..5];
let s2 = &s[6..11];*/
let s1 = &s[..5];
let s2 = &s[6..];
let whole = &s;
println!("{} {} ",s1,s2);
println!("{}",whole)
}
fn main() {
let mut s = String::from("Hello world");
let wordIndex = first_word(&s);
println!("{}",wordIndex);
}
fn first_word(s:&String) -> &str {
let bytes = s.as_bytes();
for (i, &item) in bytes.iter().enumerate() {
if item == b' ' {
return &s[..i];
}
}
return s;
}