如何在 Rust 中有条件地分配变量?

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

我正在尝试从两个不同的来源中获取一些

&[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
的堆上?

rust
1个回答
0
投票

有一个鲜为人知的技巧,依赖于编译器可以跟踪仅在一个代码路径中初始化的变量的事实:

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
};
© www.soinside.com 2019 - 2024. All rights reserved.