一个主机可以做几个网站域名,发稿,江门市住房和城乡建设部网站,商城网站开发教程视频引用与借用
上一篇中#xff0c;我们介绍了rust的所有权概念#xff0c;若直接传递变量做函数参数#xff0c;堆上的变量就会失去所有权#xff0c;而栈上变量则由于复制#xff0c;仍有所有权。
fn main(){let b 3;makes_copy(b);println!(after using a variab…引用与借用
上一篇中我们介绍了rust的所有权概念若直接传递变量做函数参数堆上的变量就会失去所有权而栈上变量则由于复制仍有所有权。
fn main(){let b 3;makes_copy(b);println!(after using a variable in stack {}, b);let a String::from(hello);take_ownership(a);// a 已被moveprintln!(after using a variable in heap {}, a);
}
fn take_ownership(a:String){println!({},a);
}
fn makes_copy(a:i32){println!({},a);
}Rust对引用的定义即指针实现类似于C中的取地址
let x 3;
// y即x的引用
let y x;
// 必须解引用否则类型不一致
assert_eq!(3,*y);用引用类型参数代替上一篇的原参数且默认是不可变的 若要修改引用则要加上可变声明注意看变量声明、函数声明、函数调用入参形式
fn main(){let mut a String::from(Hello);cal_len(mut a);println!({},a);
}
fn cal_len(a: mut String) - (){a.push_str(, world!);
}可变引用同时只能有一个 这是为了避免数据竞争在C多线程程序中使用互斥锁避免争抢操作同一块内存而Rust直接限制数据竞争。
let mut s String::from(hello);let r1 mut s;
let r2 mut s;
// r1结束前声明可变引用r2导致重复可变应用编译报错
println!({}, {}, r1, r2);引用作用域的结束位置是该变量最后一次使用的位置
Rust避免了悬垂引用即避免出现指针原指向的对象已被清除但指针仍存在的风险。
fn main() {let reference_to_nothing dangle();
}
// 如下函数错误因为a已经被清除
fn dangle() - String {let a String::from(hello);a
}总结 同一时刻你只能拥有要么一个可变引用, 要么任意多个不可变引用。 引用必须总是有效的。 如下来自 AI助手 静态类型Rust是一种静态类型语言变量在声明时必须指定其类型并且一旦指定类型不能更改。 强类型Rust是一种强类型语言变量不能隐式地转换为其他类型必须使用类型转换来显式地进行转换。 不可变性Rust默认情况下变量是不可变的即不能修改其值。如果需要修改变量的值需要使用 mut 关键字来声明可变变量。 所有权Rust中的变量具有所有权每个值都有一个唯一的拥有者。当拥有者超出作用域时值将被销毁。 解引用和引用Rust中可以使用 符号来引用变量以便在不拥有所有权的情况下访问其值。通过解引用操作符 *可以使用引用来访问变量的值。 可变性引用在Rust中可以通过借用变量来让其它代码可以读取和修改该变量的值但是只能在特定范围内进行并在借用结束后返回变量的所有权。 生命周期Rust中的变量有一个生命周期用于限定变量的有效范围。当变量超出其生命周期时它将被销毁。