我正在尝试将一个字符串拆分成几个部分并将所有内容存储在同一个结构中,我希望这样做而不会克隆任何内容。
这大致是我所拥有的:
STRUCT :
pub struct PkgName<'a> {
pub fname: String,
pub name: &'a str,
pub ver: &'a str,
}
Impl (减去终生参数):
impl PkgName {
//the String move is intended, to avoid cloning
fn parse(fname: String) -> PkgName {
let end_name: usize = /* .... */;
let name = &fname[..end_name];
let ver = &fname[end_name+1..];
PkgName {fname, name, ver}
}
}
我已经尝试了几种生命周期参数组合,但没有用。
期望结果的示例:
PkgName {
fname: "archlinux-keyring-20170823-1",
name: "archlinux-keyring",
ver: "20170823-1"
}
再次:name
和ver
必须是fname
的切片。
修改
阅读副本后:Why can't I store a value and a reference to that value in the same struct?
我提出了一个涉及不安全代码的替代解决方案:新类型应该存储字段之间的偏移量(目标 - 源)加上一个额外的偏移量,使其指向所需字符串的开头;它也应该存储大小。它基本上仍然像引用一样,因此它应该实现Deref
。
由于只有偏移量保存在这种新类型中,这是移动安全的,当然,只应该应用于不可变字段。