返回引用当前函数拥有的数据的值

the*_*key 3 rust

此代码引发关于从函数返回引用的错误:

fn sha512_256_digest(str: &[u8]) -> &[u8] {
    let x = digest::digest(&digest::SHA512_256, str);
    x.as_ref()
}
Run Code Online (Sandbox Code Playgroud)

在这里返回xas_ref()值的正确方法是什么?

sam*_*dy1 6

由于您返回的值是在函数中创建的(因此由函数拥有),因此无法返回对它的引用,因为函数完成后它将不存在。

您必须更改函数以返回自有值,或者使其参数成为可变引用&mut [u8]并删除返回值 - 因此您的函数签名选项可能是以下之一:

fn sha512_256_digest(str: &mut [u8])
Run Code Online (Sandbox Code Playgroud)

或者

fn sha512_256_digest(str: &[u8]) -> Vec<u8>
Run Code Online (Sandbox Code Playgroud)

前者的完整示例是:

let mut x = <insert your byte array here>;
sha512_256_digest(&mut x);
<use x here>
Run Code Online (Sandbox Code Playgroud)

后者的完整示例是:

let x = <insert your byte array here>;
let y = sha512_256_digest(&x);
<use y here>
Run Code Online (Sandbox Code Playgroud)


use*_*968 5

简短的回答:你不能。那是因为digest()返回一个拥有的值并且as_ref()(根据定义)从中借用。当函数返回时,返回值所拥有的内存digest()被销毁,返回的引用as_ref()变为无效。

我猜你的目标是隐藏digest()返回 a的实现细节GenericArray,而你只需要一个&[u8]. 你可以通过隐藏具体类型来获得类似的东西:

fn sha512_256_digest(str: &[u8]) -> impl AsRef<[u8]> {
    digest::digest(&digest::SHA512_256, str)
}
Run Code Online (Sandbox Code Playgroud)

... 应该管用。函数签名表示返回值将是某种匿名类型,调用者只能知道它可以像&[u8]. 来电者可以做

// `d` is of some anonymous type
let d = sha512_256_digest(...);

// `db` is a &[u8]
let db = d.as_ref();
Run Code Online (Sandbox Code Playgroud)

但是,我建议不要以这种方式隐藏类型。