首页 > 解决方案 > 返回引用当前函数拥有的数据的值

问题描述

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

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

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

标签: rust

解决方案


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

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

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

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

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

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

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


推荐阅读