Rust 可变值与可变引用
Rust mutable value vs mutable reference
和
有什么区别
let y = &mut 5;
*y += 1;
let x = *y + 1;
和
let mut y = 5;
y += 1;
let x = y + 1;
他们 return 通过 println!
结果相同,但我无法决定哪一个更可取。
鉴于您将一个变量绑定到一个或另一个变量,然后在本地调用 println!
的简单示例,结果确实没有太大差异(正如您所指出的)。
当您跨越函数边界时,可变值与可变引用会变得更加清晰。看看这段代码:
fn main() {
let mut x = &mut 5;
do_work(x);
println!("{}", x);
}
fn do_work(n: &mut u32) {
*n += 5;
}
你认为它打印了什么? Here it is on the playground
现在看这段代码:
fn main() {
let mut x = 5;
do_work(x);
println!("{}", x);
}
fn do_work(mut n: u32) {
n += 5;
}
你认为这会打印出什么? Here it is on the playground
答案是:
顶部代码块打印 10
。底部代码块打印 5
.
使用可变引用意味着您正在引用内存中存储变量 x
的位置。跨越函数边界,您可以更改存储在内存中的值。当方法 returns 和 println!
命中时.. x
的值被更新。
在这个具体的例子中,x
是一个 u32
,它实现了 Copy
特征。当您将 x
传递给 do_work
方法时,会生成 x
的副本。在do_work
方法体中,n += 5
在copy中增加了5..完全没有引用原来的内存块
...can't decide which one is preferable.
这完全取决于用例。跨函数边界需要引用原来的内存吗?如果您已将变量标记为可变的,则很有可能您确实想要引用原始内存以希望更新它。在这种情况下,您将使用可变引用。如果您只是在函数内局部改变变量..那么您将不需要引用。
和
有什么区别let y = &mut 5;
*y += 1;
let x = *y + 1;
和
let mut y = 5;
y += 1;
let x = y + 1;
他们 return 通过 println!
结果相同,但我无法决定哪一个更可取。
鉴于您将一个变量绑定到一个或另一个变量,然后在本地调用 println!
的简单示例,结果确实没有太大差异(正如您所指出的)。
当您跨越函数边界时,可变值与可变引用会变得更加清晰。看看这段代码:
fn main() {
let mut x = &mut 5;
do_work(x);
println!("{}", x);
}
fn do_work(n: &mut u32) {
*n += 5;
}
你认为它打印了什么? Here it is on the playground
现在看这段代码:
fn main() {
let mut x = 5;
do_work(x);
println!("{}", x);
}
fn do_work(mut n: u32) {
n += 5;
}
你认为这会打印出什么? Here it is on the playground
答案是:
顶部代码块打印 10
。底部代码块打印 5
.
使用可变引用意味着您正在引用内存中存储变量 x
的位置。跨越函数边界,您可以更改存储在内存中的值。当方法 returns 和 println!
命中时.. x
的值被更新。
在这个具体的例子中,x
是一个 u32
,它实现了 Copy
特征。当您将 x
传递给 do_work
方法时,会生成 x
的副本。在do_work
方法体中,n += 5
在copy中增加了5..完全没有引用原来的内存块
...can't decide which one is preferable.
这完全取决于用例。跨函数边界需要引用原来的内存吗?如果您已将变量标记为可变的,则很有可能您确实想要引用原始内存以希望更新它。在这种情况下,您将使用可变引用。如果您只是在函数内局部改变变量..那么您将不需要引用。