1.通过参数形式使用引用
调用函数并传入引用
rust"> //String::from会分配内存来存储RUST语言参考与借用//然后将s指针指向这块内存地址let mut s=String::from("RUST语言参考与借用");println!("{}",s);//调用自定义函数并传入引用let x= reftest(&mut s);//取返回值,传入时要添加mutprintln!("==={}===",x);//输出
函数声明:
rust">//函数名: reftest
//参数: s 参数类型: String &:表示是一个引用
//->:表示函数有返回
//usize:表示函数返回类型
fn reftest(s:&mut String)->usize{//引用不拥有内存所有权,只能读取,不能修改内存数据// ^ `s` is a `&` reference,// so the data it refers to cannot be borrowed as mutable//s.push_str("okok");//如果要修改,传入的引用必须是可变引用//增加mut关键字,使用引用内存可修改s.push_str("===>HelloWorld!");println!("修改后的字符串: {}",s);return s.len()
}
2.可变量多次引用
rust">//一个可变量,同时最多只能被引用一次let ref1 =&mut s;//报: ^^^^^^ second mutable borrow occurs here//同一作用域内会造成数据竞争//let ref2=&mut s;println!("作用域1==={}",ref1);//使用作用域名隔离,要解决上面问题{let ref2 = &mut s;println!("作用域2==={}",ref2);//测试, ^^^^^^ second mutable borrow occurs here//不可同时调用//println!("{},{}",ref1,ref2);}
3.不可变量多次引用
rust">//可变引用可多次被不可变引用指向let ref3=&s;//强制转换let ref4=&s;//强制转换println!("=={},{}",ref3,ref4);let ref5 = &mut s;println!("{}",ref5);//同时使用// ^^^^^^ mutable borrow occurs here//因为此时 ref3与ref4在使用这块内存,不可同时被ref5访问//println!("=={},{},{}===",ref3,ref4,ref5);println!(">>>{}",return_inner_str());
4. 悬空引用演示
rust">//悬空引用演示,不可返回内部变量的引用
// expected named lifetime parameter
/*fn return_inner_ref() -> &String{let s =String::from("Hello");return &s;
}*/fn return_inner_str() -> String{let s = String::from("Hello");// s //不加return 不用加;return s;
}
5.完整示例代码:
rust">fn main() {//String::from会分配内存来存储RUST语言参考与借用//然后将s指针指向这块内存地址let mut s=String::from("RUST语言参考与借用");println!("{}",s);//调用自定义函数并传入引用let x= reftest(&mut s);//取返回值,传入时要添加mutprintln!("==={}===",x);//输出//一个可变量,同时最多只能被引用一次let ref1 =&mut s;//报: ^^^^^^ second mutable borrow occurs here//同一作用域内会造成数据竞争//let ref2=&mut s;println!("作用域1==={}",ref1);//使用作用域名隔离,要解决上面问题{let ref2 = &mut s;println!("作用域2==={}",ref2);//测试, ^^^^^^ second mutable borrow occurs here//不可同时调用//println!("{},{}",ref1,ref2);}//可变引用可多次被不可变引用指向let ref3=&s;//强制转换let ref4=&s;//强制转换println!("=={},{}",ref3,ref4);let ref5 = &mut s;println!("{}",ref5);//同时使用// ^^^^^^ mutable borrow occurs here//因为此时 ref3与ref4在使用这块内存,不可同时被ref5访问//println!("=={},{},{}===",ref3,ref4,ref5);println!(">>>{}",return_inner_str());}//函数名: reftest
//参数: s 参数类型: String &:表示是一个引用
//->:表示函数有返回
//usize:表示函数返回类型
fn reftest(s:&mut String)->usize{//引用不拥有内存所有权,只能读取,不能修改内存数据// ^ `s` is a `&` reference,// so the data it refers to cannot be borrowed as mutable//s.push_str("okok");//如果要修改,传入的引用必须是可变引用//增加mut关键字,使用引用内存可修改s.push_str("===>HelloWorld!");println!("修改后的字符串: {}",s);return s.len()
}//悬空引用演示,不可返回内部变量的引用
// expected named lifetime parameter
/*fn return_inner_ref() -> &String{let s =String::from("Hello");return &s;
}*/fn return_inner_str() -> String{let s = String::from("Hello");// s //不加return 不用加;return s;
}