rust 将向量〈&str>转换为单个&str

vfwfrxfs  于 2023-02-16  发布在  其他
关注(0)|答案(1)|浏览(142)

编辑:我真笨,我忘了向量需要大小恒定的元素:)
我想将一个Vec<&str>转换为一个&str
例如,我需要{"a","bc"} -> "abc"
我知道您可以使用join("")方法来完成此操作,但是因为内存已经正确布局,所以感觉有些多余。
我写了一个函数来做这件事,但是它使用了unsafe。有没有更好/更干净的方法来做这件事?

fn vec_to_str(input: Vec<&str>) -> Option<&str> {
    let last_elem = input.last()?;
    unsafe {
        let last = last_elem.as_bytes().as_ptr().add(last_elem.len());
        let first = input.first()?.as_bytes().as_ptr();
        let len = last.offset_from(first);
        Some(str::from_utf8_unchecked(from_raw_parts(first, len.try_into().unwrap())))
    }
}
y53ybaqx

y53ybaqx1#

如果不创建单独的分配,则无法从任意Vec<&str>获取组合的&strVec连续存储其元素是正确的,但这些元素是&str,它们是引用。references 连续存储,但是这对于 referenced 数据是如何组织的没有任何意义。input的内存结构看起来类似于:

+----------+      +----------+      +----------+
| ptr      |----->| [0].ptr  |----->| "a"      |
+----------+      +----------+      +----------+
| size     |      | [0].size |
+----------+      +----------+      +----------+
| capacity |      | [1].ptr  |----->| "bc"     |
+----------+      +----------+      +----------+
                  | [1].size |
                  +----------+

因此,您只需使用.join("")创建一个新的String

相关问题