我对Rust还是陌生的,并开始得到借款的概念... 我明白了为什么在返回函数所引用的值时会返回错误。 在这里返回 x 的 as_ref()值的正确方法是什么?
fn sha512_256_digest(str: &[u8]) -> &[u8] {
let x = digest::digest(&digest::SHA512_256, str);
x.as_ref()
}
答案 0 :(得分:2)
简短的回答:您不能。这是因为digest()
返回一个拥有的值,而as_ref()
(根据定义)是从它那里借来的。当函数返回时,digest()
返回值拥有的内存被破坏,as_ref()
返回的引用变为无效。
我想您的目标是隐藏digest()
返回GenericArray
的实现细节,而您只需要一个&[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();
但是,我建议不以这种方式隐藏类型。
答案 1 :(得分:0)
我不确定您使用的是哪个哈希库,但是应该有一种获取实际哈希数据的方法(而不是对其的引用)。查看您的代码,这可能是类型[u8; 32]
的值。这是您要从函数中返回的值。
答案 2 :(得分:0)
由于您要返回的值是在函数中创建的(并归其所有),因此对该函数的引用不能会返回,因为一旦函数完成,该值将不存在。
您必须更改函数以返回拥有的值,或者将其参数设为可变引用&mut [u8]
并删除返回值-因此,用于函数签名的选项可能是以下之一:
fn sha512_256_digest(str: &mut [u8])
或
fn sha512_256_digest(str: &[u8]) -> Vec<u8>
前者的完整示例为:
let mut x = <insert your byte array here>;
sha512_256_digest(&mut x);
<use x here>
具有后者的完整示例为:
let x = <insert your byte array here>;
let y = sha512_256_digest(&x);
<use y here>