Function 我想把一个向量的引用传递给一个函数,然后在那个里修改它并作为向量返回

Function 我想把一个向量的引用传递给一个函数,然后在那个里修改它并作为向量返回,function,vector,reference,rust,borrowing,Function,Vector,Reference,Rust,Borrowing,我希望将包含i64值的向量的地址作为参数传递给函数,然后我希望函数在其原始位置修改向量,并将修改后的向量作为i64返回 我试图将向量的可变引用传递给函数,并试图对其进行修改,但编译器显示错误:存在具有类似名称的结构,错误:找到了预期类型宏等 fn main(){ 让mut my_vector:Vec=Vec::new(); 我的推向量(11); 我的推向量(12); 我的推向量(13); println!(“{:?}”,我的向量); 让vec_ref:&[vec]=&my_vector; 设v2

我希望将包含
i64
值的向量的地址作为参数传递给函数,然后我希望函数在其原始位置修改向量,并将修改后的向量作为
i64
返回

我试图将向量的可变引用传递给函数,并试图对其进行修改,但编译器显示错误:存在具有类似名称的结构,错误:找到了预期类型宏等

fn main(){
让mut my_vector:Vec=Vec::new();
我的推向量(11);
我的推向量(12);
我的推向量(13);
println!(“{:?}”,我的向量);
让vec_ref:&[vec]=&my_vector;
设v2=change_vector(&mut vec_ref);
println!(“{:?}”,v2);
println!(“{:?}”,我的向量);
}
fn改变向量(新向量:&[vec])->vec{
新的推向量(11);
新向量
}
()

我希望我的函数
change_vector()
接收
my_vector
位置的引用,修改它,然后将其作为向量返回。未发生,编译器显示错误并中止:

错误[E0573]:应为类型,找到宏`vec`
-->src/main.rs:7:20
|
7 |让vec_ref:&[vec]=&my_vector;
|                    ^^^^^^^^
帮助:存在具有类似名称的结构
|
7 |让vec_ref:&[vec]=&my_vector;
|                    ^^^
帮助:使用“!”调用宏
|
7 |让vec_ref:&[vec!]=&my_vector;
|                    ^^^^
错误[E0573]:应为类型,找到宏'vec'`
-->src/main.rs:13:32
|
13 | fn变化向量(新向量:&[vec])->vec{
|                                ^^^^^^^^
帮助:存在具有类似名称的结构
|
13 | fn变化向量(新向量:&[Vec])->Vec{
|                                ^^^
帮助:使用“!”调用宏
|
13 | fn改变向量(新向量:&[vec!])->vec{
|                                ^^^^

如果有任何帮助,我将不胜感激。

您只需按值获取向量,修改它,然后返回:

fn change_vector(mut new_vector: Vec<i64>) -> Vec<i64> {
    new_vector.push(11);
    new_vector
}
fn更改向量(mut新向量:Vec)->Vec{
新的推向量(11);
新向量
}
这不会复制向量的内容,它只是移动(只复制向量的内部指针及其长度)

另一种可能性是将向量作为可变参考:

fn change_vector(new_vector: &mut Vec<i64>) {
    new_vector.push(11);
}
fn更改向量(新向量:&mut向量){
新的推向量(11);
}
您的代码(带大写的Vec)

fn更改向量(新向量:&[Vec])->Vec{
新的推向量(11);
新向量
}

接受i64的向量片,这可能不是您想要的

您的代码中有一系列问题源于不正确的语法和目标。让我们逐一讨论:

let mut my_vector: Vec<i64> = Vec::new();
my_vector.push(11);
my_vector.push(12);
my_vector.push(13);
println!("{:?}", my_vector);
这不好。对
Vec
的引用是
&Vec
,而不是一个片段。将此更改为
let-Vec\u-ref:&Vec=&my\u-vector;
。您也不需要这一行。如果您决定以后使用此引用,您的代码将由于稍后的决定而停止编译,我们将讨论

let v2 = change_vector(&mut vec_ref);
这不好。你不能接受可变引用或不可变引用。这是有道理的。
change\u vector(&mut my\u vector)
在语法上很好,但与之前的作业相结合,这是一个雷区。您在上面一行获得了一个不可变的引用,如
vec\u ref
;如果您不使用
vec\u ref
,编译器将为您完全删除它;但是,如果您决定使用它,您的代码将无法编译ld同时是一个不可变和可变的借用

fn change_vector(new_vector: &[vec<i64>]) -> Vec<i64> {
这很好

new_vec
对于新的退货签名,这一行是多余的


更正后的代码是可见的

如果它是同一个向量,为什么要返回它?为什么不呢?您好!错误消息的原因是打字错误:您写了
vec
,但应该写
vec
(大写).完全阅读错误信息是很有意义的,因为这已经表明了这一点。我建议结束这个问题,因为“修复打字错误”这并不是一个很有用的答案。但是由于拼写错误被修复,你的代码仍然无法编译。我想请你在拼写错误被修复的情况下创建另一个问题——这样我们就可以很容易地回答新的问题了!谢谢。我的代码除了拼写错误之外还有其他错误,你和其他人都正确地指出了。非常感谢你的更正部分。这是一个很大的帮助。谢谢我想你是从C/C++那里来的,因为你犯了错误;不要犹豫,问更多的问题,我相信其他人和我都会很乐意帮助你
fn change_vector(new_vector: &[vec<i64>]) -> Vec<i64> {
new_vector.push(11);
new_vec