如何在生锈中连接静态数组?

问题描述 投票:-1回答:1

我有两个u8静态数组,我会实现一个连接它们的函数。这样的事情

fn concat_u8(first: &'static [u8], second: &'static [u8]) -> &'static [u8] {
    &[&first[..], &second[..]].concat()
}

编译器显示错误returns a reference to data owned by the current function。那是因为分配的内存在函数结束时是空闲的。

我如何“强迫”生命是静止的?

编辑

我有一个漫长的过程。

在开始时,该过程处理一些输入以便计算结果(即concat_u8函数)。结果是一个u8数组,将以只读方式用于剩余的过程生命周期。在“内部concat_u8事件”之后无法调用函数start

我不想使用Box,因为动态分配意味着一点开销(可能无法测量?)并将结果存储为&[u8]

我有机会这样做吗?

没有使用unsafe块,我有机会这样做吗?

rust
1个回答
4
投票

在不泄漏内存的情况下,无法将两个切片连接到具有静态生命周期的新切片。

切片连续存储在内存中。将两个片段与静态生命周期连接起来需要将它们复制到新分配的内存中,因为结果也需要是连续的。这个新分配的内存必然由当前函数拥有,因此您无法返回对它的引用。

您必须将内存的所有权转回给调用者:

pub fn concat_u8(first: &[u8], second: &[u8]) -> Vec<u8> {
    [first, second].concat()
}

不需要输入具有静态生命周期,并且可能根本不需要实现此功能,因为调用它不会比简单地内联代码更短或更清楚。

© www.soinside.com 2019 - 2024. All rights reserved.