编辑:我真笨,我忘了向量需要大小恒定的元素:)
我想将一个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())))
}
}
1条答案
按热度按时间y53ybaqx1#
如果不创建单独的分配,则无法从任意
Vec<&str>
获取组合的&str
。Vec
连续存储其元素是正确的,但这些元素是&str
,它们是引用。references 连续存储,但是这对于 referenced 数据是如何组织的没有任何意义。input
的内存结构看起来类似于:因此,您只需使用
.join("")
创建一个新的String
。