代码之家  ›  专栏  ›  技术社区  ›  Mike Jerred

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

  •  0
  • Mike Jerred  · 技术社区  · 9 月前

    我正在尝试以 &[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 是必要的吗?

    1 回复  |  直到 9 月前
        1
  •  2
  •   Chayim Friedman    9 月前

    这方面有一个鲜为人知的技巧,它依赖于编译器只能在一个代码路径变量中跟踪初始化的事实:

    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
    };