我正在尝试从两个不同的来源中获取一些
&[u8]
形式的数据:
let result = if let Some(blob_id) = blob_id {
let blob = get_blob(blob_id);
Some(blob.data())
} else if let Some(file_path) = file_path {
std::fs::read(file_path).ok().as_deref()
} else {
None
};
地点:
fn get_blob(blob_id: String) -> Blob {}
impl Blob {
pub fn data(&self) -> &[u8] {}
}
问题是,这会导致
temporary value dropped while borrowed
错误,因为 result
变量引用 blob 或文件中的内存,但这些 blob 和文件对象会在各自 if 块的末尾被删除。
这样做的惯用方法是什么?对于上下文,我想稍后在同一函数中处理这些数据,所以我认为没有必要将数据放在带有
Box
的堆上?
有一个鲜为人知的技巧,依赖于编译器可以跟踪仅在一个代码路径中初始化的变量的事实:
let blob;
let file;
let result = if let Some(blob_id) = blob_id {
blob = get_blob(blob_id);
Some(blob.data())
} else if let Some(file_path) = file_path {
file = std::fs::read(file_path).ok();
file.as_deref()
} else {
None
};