此代码引发关于从函数返回引用的错误:
fn sha512_256_digest(str: &[u8]) -> &[u8] {
let x = digest::digest(&digest::SHA512_256, str);
x.as_ref()
}
Run Code Online (Sandbox Code Playgroud)
在这里返回x的as_ref()值的正确方法是什么?
由于您返回的值是在函数中创建的(因此由函数拥有),因此无法返回对它的引用,因为函数完成后它将不存在。
您必须更改函数以返回自有值,或者使其参数成为可变引用&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)
简短的回答:你不能。那是因为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)
但是,我建议不要以这种方式隐藏类型。