rust - 返回引用当前函数拥有的数据的值
问题描述
此代码引发有关从函数返回引用的错误:
fn sha512_256_digest(str: &[u8]) -> &[u8] {
let x = digest::digest(&digest::SHA512_256, str);
x.as_ref()
}
在这里返回x的as_ref()值的正确方法是什么?
解决方案
简短的回答:你不能。那是因为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();
但是,我建议不要以这种方式隐藏类型。
推荐阅读
- python - 如何访问 Pandas 中 nunique 给出的整数?
- c# - 如何在 vb.net 中声明函数以调用 c++ dll
- html - Safari (Webkit) 不正确地显示阴影(过滤器:drop-shadow)
- node.js - 如何使用 mongoimport 从导入的 json 数据中提取模式(或提取)?
- typescript - VSCode 扩展中的 QuickOpen 文件
- python - 调整 numpy 图像数组的大小
- reactjs - React 网站按钮和输入在智能手机上不起作用
- flutter - 颤振泛型类铸造“类型'列表
' 不是类型 'List 的子类型