Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 关于所有权/使用寿命的困惑_Rust - Fatal编程技术网

Rust 关于所有权/使用寿命的困惑

Rust 关于所有权/使用寿命的困惑,rust,Rust,以下是一些将两件事合并为一件事的函数: //没错。调用时将v1/v2的所有权移入,完成时将v的所有权移回。 fn组合_v(v1:Vec,v2:Vec)->Vec{ 设v=vec![1,2,3]; 返回v; } //终生声明是正确的。我可以返回一个`&str`类型变量。 fn联合收割机(v1:&'a[i32],v2:&'a[i32])->&'a[i32]{ 设a=[1,2,3]; //无法返回对局部变量'a'的引用` 回报&a; } //这是不对的。 //错误:编译时无法知道“%i32]”类型的值

以下是一些将两件事合并为一件事的函数:

//没错。调用时将v1/v2的所有权移入,完成时将v的所有权移回。
fn组合_v(v1:Vec,v2:Vec)->Vec{
设v=vec![1,2,3];
返回v;
}
//终生声明是正确的。我可以返回一个`&str`类型变量。
fn联合收割机(v1:&'a[i32],v2:&'a[i32])->&'a[i32]{
设a=[1,2,3];
//无法返回对局部变量'a'的引用`
回报&a;
}
//这是不对的。
//错误:编译时无法知道“%i32]”类型的值的大小
fn组合_1(v1:[i32],v2:[i32])->[i32]{
设a=[1,2,3];
返回a;
}
所以我有问题:

  • 为什么可以返回
    &str
    类型,但不能返回
    &[i32]
    ?为什么函数完成时不删除
    &str
    的值

  • (如何)编写一个接受
    &[i32]
    s并返回新
    &[i32]
    的函数

  • (如何)在编译时无法确定长度时,编写一个接受
    [i32]
    s并返回新
    [i32]
    的函数

  • 为什么
    [i32]
    必须有长度,而
    &[i32]
    没有


  • 以下是您的子问题的答案:

    1) 为什么可以返回
    &str
    类型,但不能返回
    &[i32]
    ?为什么函数完成时不删除
    &str
    的值

    因为当您的代码编译时,它被称为“静态”生存期。因此,当函数完成时,它不会被丢弃

    2) 如何编写一个函数来接受
    &[i32]
    s,并返回一个新的
    &[i32]

    函数的签名是正确的。但在实现中,您需要使用
    'static
    生存期指定声明,或者至少以编译器可以将其称为
    'static
    的方式编写声明

    3) 当编译时无法确定长度时,如何编写一个接受
    [i32]
    s并返回新
    [i32]
    的函数

    要想使用它们,您需要使用
    ,并更改函数签名,如下所示:

    fn联合收割机1(v1:Box,v2:Box)->Box
    
    4) 为什么
    [i32]
    必须有长度,而
    &[i32]
    没有

    锈迹中基本上有两种形式的阵列:

    • [T;N]
      是一个由
      N
      T
      s组成的数组,它的大小是
    • [T]
      是一个只有在运行时才知道大小的
      T
      数组,它不是
      大小的
      ,实际上只能作为一个切片进行操作
      (&[T])

    一个问题中有这么多问题顺便说一句:@Stargateur的可能重复我将把它分解成几个小问题