为什么我不能引用 "if" 中的内存?
Why can't I make a reference to memory inside "if"?
我可以复制这个向量,但这需要时间和内存。
我可以写另一个 println
,但这只是一个示例 — 可能有多个循环而不是 println
— 它将占用 space 并使代码复杂化。我可以在 main
中执行转换并编写函数调用的两个版本,但更改引用要容易得多。
fn foo(mut a: &Vec<i32>) {
let mut c: Vec<i32>;
if a[0] == 0 {
c = vec![1; 3];
a = &c;
}
println!("{:?}", a);
}
fn main() {
let a: Vec<i32> = vec![0; 3];
foo(&a);
}
错误:
main.rs:9:14: 9:15 error: `c` does not live long enough
main.rs:9 a = &c;
^
Rust 中的生命周期规则相当(非常)严格:如果你有一个对象的引用,这个对象的寿命必须比引用长,双向。
这意味着必须在对象之后创建引用。
在您的例子中,a
存在于 c
之前,因此赋值 a = &c
无效。一个简单的修复方法是在创建 c
之后创建引用的副本并处理此副本:
fn foo(vec_ref: &Vec<i32>){
let mut c: Vec<i32>;
let mut a = vec_ref
if a[0] == 0 {
c = vec![1; 3];
a = &c;
}
println!("{:?}",a);
}
或者更生疏的方式:
fn foo(vec_ref: &Vec<i32>){
let mut c: Vec<i32>;
let a = if vec_ref[0] == 0 {
c = vec![1; 3];
&c
} else {
vec_ref
};
println!("{:?}",a);
}
我可以复制这个向量,但这需要时间和内存。
我可以写另一个 println
,但这只是一个示例 — 可能有多个循环而不是 println
— 它将占用 space 并使代码复杂化。我可以在 main
中执行转换并编写函数调用的两个版本,但更改引用要容易得多。
fn foo(mut a: &Vec<i32>) {
let mut c: Vec<i32>;
if a[0] == 0 {
c = vec![1; 3];
a = &c;
}
println!("{:?}", a);
}
fn main() {
let a: Vec<i32> = vec![0; 3];
foo(&a);
}
错误:
main.rs:9:14: 9:15 error: `c` does not live long enough
main.rs:9 a = &c;
^
Rust 中的生命周期规则相当(非常)严格:如果你有一个对象的引用,这个对象的寿命必须比引用长,双向。
这意味着必须在对象之后创建引用。
在您的例子中,a
存在于 c
之前,因此赋值 a = &c
无效。一个简单的修复方法是在创建 c
之后创建引用的副本并处理此副本:
fn foo(vec_ref: &Vec<i32>){
let mut c: Vec<i32>;
let mut a = vec_ref
if a[0] == 0 {
c = vec![1; 3];
a = &c;
}
println!("{:?}",a);
}
或者更生疏的方式:
fn foo(vec_ref: &Vec<i32>){
let mut c: Vec<i32>;
let a = if vec_ref[0] == 0 {
c = vec![1; 3];
&c
} else {
vec_ref
};
println!("{:?}",a);
}