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

时间:2019-11-14 16:59:23

标签: rust

我对Rust还是陌生的,并开始得到借款的概念... 我明白了为什么在返回函数所引用的值时会返回错误。 在这里返回 x as_ref()值的正确方法是什么?

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

3 个答案:

答案 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>