我想将向量的引用传递给函数然后在那里修改它并且 return 作为向量
I want to pass reference of a vector to a function then modify it there and return as vector
我想将包含 i64
值的向量的地址作为参数传递给函数,然后我希望我的函数在其原始位置修改向量,并将修改后的向量 return 作为i64
.
我尝试将向量的可变引用传递给函数并尝试对其进行修改,但编译器显示错误:存在具有相似名称的结构和错误:找到预期类型的宏等。
fn main() {
let mut my_vector: Vec<i64> = Vec::new();
my_vector.push(11);
my_vector.push(12);
my_vector.push(13);
println!("{:?}", my_vector);
let vec_ref: &[vec<i64>] = &my_vector;
let v2 = change_vector(&mut vec_ref);
println!("{:?}", v2);
println!("{:?}", my_vector);
}
fn change_vector(new_vector: &[vec<i64>]) -> Vec<i64> {
new_vector.push(11);
new_vector
}
我希望我的函数 change_vector()
接收对 my_vector
位置的引用,对其进行修改,然后 return 将其作为向量。它没有发生,编译器显示错误并中止:
error[E0573]: expected type, found macro `vec`
--> src/main.rs:7:20
|
7 | let vec_ref: &[vec<i64>] = &my_vector;
| ^^^^^^^^
help: a struct with a similar name exists
|
7 | let vec_ref: &[Vec<i64>] = &my_vector;
| ^^^
help: use `!` to invoke the macro
|
7 | let vec_ref: &[vec!] = &my_vector;
| ^^^^
error[E0573]: expected type, found macro `vec`
--> src/main.rs:13:32
|
13 | fn change_vector(new_vector: &[vec<i64>]) -> Vec<i64> {
| ^^^^^^^^
help: a struct with a similar name exists
|
13 | fn change_vector(new_vector: &[Vec<i64>]) -> Vec<i64> {
| ^^^
help: use `!` to invoke the macro
|
13 | fn change_vector(new_vector: &[vec!]) -> Vec<i64> {
| ^^^^
如有任何帮助,我将不胜感激。
您可以直接按值获取 Vector,修改它,然后 return 它:
fn change_vector(mut new_vector: Vec<i64>) -> Vec<i64> {
new_vector.push(11);
new_vector
}
这并没有复制向量的内容,它只是做了一个移动(只复制了向量的内部指针和它的长度)
另一种可能性是将向量作为可变引用:
fn change_vector(new_vector: &mut Vec<i64>) {
new_vector.push(11);
}
你的代码(Vec大写)
fn change_vector(new_vector: &[Vec<i64>]) -> Vec<i64> {
new_vector.push(11);
new_vector
}
接受一片 i64 向量,这可能不是你想要的
由于不正确的语法和目标,您的代码存在很多问题。让我们一一浏览:
let mut my_vector: Vec<i64> = Vec::new();
my_vector.push(11);
my_vector.push(12);
my_vector.push(13);
println!("{:?}", my_vector);
这很好。 my_vector
包含 [11, 12, 13]
.
let vec_ref: &[vec<i64>] = &my_vector;
这样不行。对 Vec<i64>
的引用是 &Vec<i64>
,而不是切片。将其更改为 let vec_ref:&Vec<i64> = &my_vector;
。您也不需要此行,如果您决定稍后使用此引用,您的代码将由于稍后的决定而停止编译,我们即将到达...
let v2 = change_vector(&mut vec_ref);
这样不行。您不能获取不可变引用的可变引用。按理说。
change_vector(&mut my_vector)
在语法上没问题,但结合前面的赋值,是一个雷区。您已经在上面的行中获得了 vec_ref
的不可变引用;如果您不使用 vec_ref
,编译器将为您完全删除它;但是,如果您决定使用它,您的代码将无法编译,因为您无法同时持有不可变 和 可变借用。
fn change_vector(new_vector: &[vec<i64>]) -> Vec<i64> {
由于上述原因,这并不好。应该是 fn change_vector(new_vector: &mut Vec<i64>) {
.
return 类型更改的原因是您无法从未分配的引用中 return 拥有 Vec
。如果你确实想分配,那么显然这应该是不同的。
new_vector.push(11);
这很好。
new_vec
有了新的 return 签名,这一行就多余了。
更正后的代码可见here
我想将包含 i64
值的向量的地址作为参数传递给函数,然后我希望我的函数在其原始位置修改向量,并将修改后的向量 return 作为i64
.
我尝试将向量的可变引用传递给函数并尝试对其进行修改,但编译器显示错误:存在具有相似名称的结构和错误:找到预期类型的宏等。
fn main() {
let mut my_vector: Vec<i64> = Vec::new();
my_vector.push(11);
my_vector.push(12);
my_vector.push(13);
println!("{:?}", my_vector);
let vec_ref: &[vec<i64>] = &my_vector;
let v2 = change_vector(&mut vec_ref);
println!("{:?}", v2);
println!("{:?}", my_vector);
}
fn change_vector(new_vector: &[vec<i64>]) -> Vec<i64> {
new_vector.push(11);
new_vector
}
我希望我的函数 change_vector()
接收对 my_vector
位置的引用,对其进行修改,然后 return 将其作为向量。它没有发生,编译器显示错误并中止:
error[E0573]: expected type, found macro `vec`
--> src/main.rs:7:20
|
7 | let vec_ref: &[vec<i64>] = &my_vector;
| ^^^^^^^^
help: a struct with a similar name exists
|
7 | let vec_ref: &[Vec<i64>] = &my_vector;
| ^^^
help: use `!` to invoke the macro
|
7 | let vec_ref: &[vec!] = &my_vector;
| ^^^^
error[E0573]: expected type, found macro `vec`
--> src/main.rs:13:32
|
13 | fn change_vector(new_vector: &[vec<i64>]) -> Vec<i64> {
| ^^^^^^^^
help: a struct with a similar name exists
|
13 | fn change_vector(new_vector: &[Vec<i64>]) -> Vec<i64> {
| ^^^
help: use `!` to invoke the macro
|
13 | fn change_vector(new_vector: &[vec!]) -> Vec<i64> {
| ^^^^
如有任何帮助,我将不胜感激。
您可以直接按值获取 Vector,修改它,然后 return 它:
fn change_vector(mut new_vector: Vec<i64>) -> Vec<i64> {
new_vector.push(11);
new_vector
}
这并没有复制向量的内容,它只是做了一个移动(只复制了向量的内部指针和它的长度)
另一种可能性是将向量作为可变引用:
fn change_vector(new_vector: &mut Vec<i64>) {
new_vector.push(11);
}
你的代码(Vec大写)
fn change_vector(new_vector: &[Vec<i64>]) -> Vec<i64> {
new_vector.push(11);
new_vector
}
接受一片 i64 向量,这可能不是你想要的
由于不正确的语法和目标,您的代码存在很多问题。让我们一一浏览:
let mut my_vector: Vec<i64> = Vec::new();
my_vector.push(11);
my_vector.push(12);
my_vector.push(13);
println!("{:?}", my_vector);
这很好。 my_vector
包含 [11, 12, 13]
.
let vec_ref: &[vec<i64>] = &my_vector;
这样不行。对 Vec<i64>
的引用是 &Vec<i64>
,而不是切片。将其更改为 let vec_ref:&Vec<i64> = &my_vector;
。您也不需要此行,如果您决定稍后使用此引用,您的代码将由于稍后的决定而停止编译,我们即将到达...
let v2 = change_vector(&mut vec_ref);
这样不行。您不能获取不可变引用的可变引用。按理说。
change_vector(&mut my_vector)
在语法上没问题,但结合前面的赋值,是一个雷区。您已经在上面的行中获得了 vec_ref
的不可变引用;如果您不使用 vec_ref
,编译器将为您完全删除它;但是,如果您决定使用它,您的代码将无法编译,因为您无法同时持有不可变 和 可变借用。
fn change_vector(new_vector: &[vec<i64>]) -> Vec<i64> {
由于上述原因,这并不好。应该是 fn change_vector(new_vector: &mut Vec<i64>) {
.
return 类型更改的原因是您无法从未分配的引用中 return 拥有 Vec
。如果你确实想分配,那么显然这应该是不同的。
new_vector.push(11);
这很好。
new_vec
有了新的 return 签名,这一行就多余了。
更正后的代码可见here