- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
在 Rust 中,*、ref、mut、& 和 ref mut 是用于处理引用、解引用和可变性的关键字和操作符,它们在不同的上下文中有不同的用法.
*
解引用* 属于操作符 。
用于解引用指针或引用,以访问其指向的值。 通过解引用,可以从指针或引用中获取实际的值.
fn main() {
let x = 5;
let y = &x; // y 是对 x 的不可变引用
println!("y: {}", *y); // 通过解引用 y 获取 x 的值,输出: y: 5
}
fn main() {
let mut x = 10;
let y = &mut x; // y 是对 x 的可变引用
*y += 5; // 通过解引用 y 修改 x 的值
println!("x: {}", x); // 输出: x: 15
}
fn main() {
let x = 42;
let y = &x as *const i32; // 创建不可变裸指针
unsafe {
println!("y: {}", *y); // 解引用不可变裸指针
}
let x = Box::new(10); // Box 智能指针
println!("x: {}", *x); // 解引用 Box,获取其值,输出: x: 10
}
&
借用引用& 也是操作符 。
创建一个值的不可变引用,允许读而不获取所有权,该值在引用期间是只读的.
fn main() {
let x = 10;
let y = &x; // y 是对 x 的不可变引用
println!("y: {}", y); // 输出: y: 10
}
fn print_value(x: &i32) {
println!("Value: {}", x);
}
fn main() {
let a = 10;
print_value(&a); // 传递 a 的不可变引用
}
fn main() {
let reference = &4;
match reference {
&val => println!("Got a value via destructuring: {:?}", val),
}
}
struct Point<'a> {
x: &'a i32,
y: &'a i32,
}
fn main() {
let x = 10;
let y = 20;
let point = Point { x: &x, y: &y }; // 使用引用初始化结构体字段
println!("Point: ({}, {})", point.x, point.y); // 输出: Point: (10, 20)
}
fn main() {
let vec = vec![1, 2, 3];
for val in &vec {
println!("Value: {}", val); // 输出: 1, 2, 3
}
}
fn main() {
let s = String::from("hello");
let slice = &s[0..2]; // 创建字符串切片
println!("Slice: {}", slice); // 输出: Slice: he
}
mut
可变mut 是一个关键字 。
声明一个变量或引用为可变的,可以修改其值.
fn main() {
let mut x = 5; // x 是可变的
x += 1;
println!("x: {}", x); // 输出: x: 6
}
fn increment(mut num: i32) -> i32 {
num += 1;
num
}
fn main() {
let mut x = 5;
let y = &mut x;
*y += 1;
println!("{}", x); // 输出 6
}
struct Point {
x: i32,
y: i32,
}
fn main() {
let mut p = Point { x: 0, y: 0 };
p.x = 5;
p.y = 10;
println!("Point: ({}, {})", p.x, p.y); // 输出 Point: (5, 10)
}
let mut tuple = (5, 10);
tuple.0 = 15;
match Some(10) {
Some(mut value) => {
value += 1;
println!("{}", value); // 输出 11
}
None => {},
}
let mut vec = vec![1, 2, 3];
for num in &mut vec {
*num += 1;
}
println!("{:?}", vec);
&mut
可变借用引用&mut 既不属于操作符也不属于关键字 。
创建一个值的可变引用,允许修改值而不获取所有权.
fn main() {
let mut x = 10;
{
let y = &mut x; // y 是对 x 的可变引用
*y += 5; // 修改 x 的值
} // y 的生命周期结束,此时 x 的可变借用结束
println!("x: {}", x); // 输出: x: 15
}
fn add_one(x: &mut i32) {
*x += 1;
}
fn main() {
let mut a = 10;
add_one(&mut a); // 传递 a 的可变引用
println!("a: {}", a); // 输出: a: 11
}
struct Point<'a> {
x: &'a mut i32,
y: &'a mut i32,
}
fn main() {
let mut x = 10;
let mut y = 20;
let point = Point { x: &mut x, y: &mut y }; // 使用可变引用初始化结构体字段
*point.x += 1;
*point.y += 1;
println!("Point: ({}, {})", point.x, point.y); // 输出: Point: (11, 21)
}
fn main() {
let mut vec = vec![1, 2, 3];
for val in &mut vec {
*val += 1; // 修改集合中的元素
}
println!("{:?}", vec); // 输出: [2, 3, 4]
}
fn main() {
let mut pair = (10, 20);
match pair {
(ref mut x, ref mut y) => {
*x += 1;
*y += 1;
println!("x: {}, y: {}", x, y); // 输出: x: 11, y: 21
},
}
}
struct Counter {
value: i32,
}
impl Counter {
fn increment(&mut self) {
self.value += 1;
}
}
fn main() {
let mut counter = Counter { value: 0 };
counter.increment(); // 使用可变引用调用方法
println!("Counter value: {}", counter.value); // 输出: Counter value: 1
}
ref
模式匹配中创建引用ref 属于关键字 。
在模式匹配中借用值的不可变引用,而不是获取所有权.
fn main() {
let tuple = (1, 2);
let (ref x, ref y) = tuple; // x 和 y 是对 tuple 中元素的不可变引用
println!("x: {}, y: {}", x, y); // 输出: x: 1, y: 2
}
fn main() {
let pair = (10, 20);
match pair {
(ref x, ref y) => {
println!("x: {}, y: {}", x, y); // x 和 y 是 pair 元素的不可变引用
}
}
}
// if let
fn main() {
let some_value = Some(42);
if let Some(ref x) = some_value {
println!("Found a value: {}", x); // x 是 some_value 的不可变引用
}
}
// while let
fn main() {
let mut stack = vec![1, 2, 3];
while let Some(ref x) = stack.pop() {
println!("Popped: {}", x); // x 是 stack 中最后一个元素的不可变引用
}
}
fn print_ref((ref x, ref y): &(i32, i32)) {
println!("x: {}, y: {}", x, y); // x 和 y 是元组元素的不可变引用
}
fn main() {
let pair = (10, 20);
print_ref(&pair); // 传递 pair 的引用
}
fn main() {
let vec = vec![1, 2, 3];
for ref x in &vec {
println!("x: {}", x); // x 是 vec 中元素的不可变引用
}
}
ref mut
模式匹配中创建可变引用ref mut 属于关键字 。
在模式匹配中借用值的可变引用,允许修改该值.
fn main() {
let mut pair = (10, 20);
match pair {
(ref mut x, ref mut y) => {
*x += 1;
*y += 1;
println!("x: {}, y: {}", x, y); // 输出: x: 11, y: 21
}
}
// pair 的值已经被修改
}
fn main() {
let mut some_value = Some(42);
if let Some(ref mut x) = some_value {
*x += 1;
println!("Found a value: {}", x); // 输出: Found a value: 43
}
}
fn main() {
let mut stack = vec![1, 2, 3];
while let Some(ref mut x) = stack.pop() {
*x += 1;
println!("Popped: {}", x); // 输出: Popped: 4, Popped: 3, Popped: 2
}
}
fn increment_tuple((ref mut x, ref mut y): &mut (i32, i32)) {
*x += 1;
*y += 1;
}
fn main() {
let mut pair = (10, 20);
increment_tuple(&mut pair); // 传递 pair 的可变引用
println!("pair: {:?}", pair); // 输出: pair: (11, 21)
}
fn main() {
let mut pair = (10, 20);
let (ref mut x, ref mut y) = pair;
*x += 1;
*y += 1;
println!("x: {}, y: {}", x, y); // 输出: x: 11, y: 21
println!("{:?}", pair); // (11, 21)
}
*
:解引用操作符,用于访问指针或引用指向的值的类型。&
:借用操作符,用于创建不可变引用的类型,允许只读访问。mut
:关键字,用于声明可变变量或参数的类型,允许其值被修改。&mut
:借用操作符,用于创建可变引用的类型,允许读写访问。ref
:模式匹配中的关键字,用于创建不可变引用的类型,避免所有权转移。ref mut
:模式匹配中的关键字,用于创建可变引用的类型,允许修改引用的值。最后此篇关于Rust中*、&、mut、&mut、ref、refmut的用法和区别的文章就讲到这里了,如果你想了解更多关于Rust中*、&、mut、&mut、ref、refmut的用法和区别的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
平时很少在jquery中用到this。查看代码时发现用到了,就调试出this的值,心想原来如此。还是挺有用的。这里总结一下this与$(this)的区别和使用。 $(this)生成的是什么?
使用单例类和应用程序范围的托管 bean 来保存应用程序数据有区别吗? 我需要查找某些 JNDI 资源,例如远程 bean 接口(interface),因此我为自己编写了一个单例来缓存我的引用并且只允
如果您仔细查看包含的图片,您会注意到您可以使用 Eclipse IDE 重构 Groovy 代码并将方法转换为闭包,反之亦然。那么,闭包到底是什么,它与方法有什么不同呢?有人可以举一个使用闭包的好例子
vagrant box repackage有什么区别( docs ) 和 vagrant package ( docs )? 我意识到 vagrant package仅适用于 VirtualBox 提
我想看看是否有人可以解释为什么以下代码适用于 valueOf 但不适用于其他代码。 import java.math.BigDecimal; public class Change { publ
这个问题已经有答案了: 已关闭12 年前。 Possible Duplicates: What is Closures/Lambda in PHP or Javascript in layman te
This question already has answers here: Vagrant, Docker, Puppet, Chef (3个答案) 2年前关闭。 docker和chef有什么共同
以下代码在95%的机器上产生相同的输出,但是在几台机器上却有所不同。在 Debug模式下,输出: Changing from New to Fin OK 但在 Release模式下: Changing
////Creating Object var Obj; // init Object Obj= {}; 它们之间有什么区别两个? 有没有可能把它变成一个单行? 这样使用有什么好处吗?
我想找出定时器服务之间的区别。我应该使用哪个以及何时使用。我正在使用 Jboss 应用服务器。 1) java.ejb.Schedule。 @Schedule注解或配置自xml。 2) javax.e
我发现在 C++ 中可以通过三种不同的方式将对象传递给函数。假设我的类(class)是这样的: class Test { int i; public: Test(int x);
有什么区别。 public class Test { public static void main(String args[]) { String toBeCast = "c
如果我有一列,设置为主索引,设置为INT。 如果我不将其设置为自动递增,而只是将唯一的随机整数插入其中,与自动递增相比,这是否会减慢 future 的查询速度? 如果我在主索引和唯一索引为 INT 的
这两种日期格式有什么区别。第一个给出实际时间,第二个给出时间购买添加时区偏移值。 NSDateFormatter * dateFormatter = [[NSDateFormatter alloc]
如果有一个函数,请说foo: function foo() { console.log('bar'); } 那么在 JavaScript 中,从另一个函数调用一个函数有什么区别,如下所示: f
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
代码是什么: class Time { private: int hours; int minutes; int seconds; pu
我知道这是非常基本的,但有人介意解释一下这两个数组声明之间的区别吗: #include array myints; ...和: int myints[5]; ...以及为什么 myints.size
我学会了如何根据 http://reference.sitepoint.com/css/specificity 计算 css 特异性但是,基于this reference,我不明白伪类(来自c)和伪元
为什么在运行 2) 时会出现额外的空行?对我来说 1 就像 2。那么为什么 2) 中的额外行? 1) export p1=$(cd $(dirname $0) && pwd) #
我是一名优秀的程序员,十分优秀!