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

Rust 返回引用当前函数拥有的数据的值,rust,Rust,此代码引发有关从函数返回引用的错误: fn sha512_256_digest(str: &[u8]) -> &[u8] { let x = digest::digest(&digest::SHA512_256, str); x.as_ref() } 在这里返回x的as_ref()值的正确方法是什么?我不确定您使用的是哪个哈希库,但是应该有一种方法来获取实际的哈希数据(而不是对它的引用)。查看您的代码,这可能是一个类型为[u8;32]的值。这是您希

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

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

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

我不确定您使用的是哪个哈希库,但是应该有一种方法来获取实际的哈希数据(而不是对它的引用)。查看您的代码,这可能是一个类型为
[u8;32]
的值。这是您希望从函数返回的值。

简短回答:您不能。这是因为
digest()
返回一个拥有的值,而
作为_ref()
(根据定义)从中借用。当函数返回时,
digest()
的返回值所拥有的内存将被销毁,
as\u ref()
返回的引用将无效

我猜您的目标是隐藏
摘要()
返回
通用数组的实现细节,而您只需要
和[u8]
。通过隐藏具体类型,可以获得类似的结果:

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

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

因为您返回的值是在函数中创建的(因此属于函数),所以不能返回对它的引用,因为一旦函数完成,它就不存在了

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

fn sha512\u 256\u摘要(str:&mut[u8])

fn sha512_256_摘要(str:&u8])->Vec
前者的一个完整示例是:

让mut x=;
sha512_256_摘要(&mut x);
后者的一个完整例子是:

设x=;
设y=sha512_256_摘要(&x);
“我知道返回错误的原因”您能在帖子中引用它吗?这可以帮助未来的用户找到这个。
// `d` is of some anonymous type
let d = sha512_256_digest(...);

// `db` is a &[u8]
let db = d.as_ref();