Option在防锈中的实际用途是什么?

时间:2019-08-18 15:43:14

标签: rust

考虑此示例

fn main() {
    let mut i: Option<i32> = None;
    //after some processing it got some value of 55
    i = Some(55);
    println!("value is {:?}", i.unwrap());
}

在执行过程中,nil代表该类型的零值。 但是,在锈蚀中,它表示没有值。在实践中缺少值有什么用?

声明具有类型的变量时,它必须具有一些已初始化或未初始化的值。为什么要声明它不存在?

还请解释一下,在初始声明期间或i获得某些值时,为i分配了什么内存?

我可能会问一个愚蠢的问题,但想了解这个概念的必要性。

1 个答案:

答案 0 :(得分:3)

  

缺少值在实践中如何有用?

一个简单的示例是一个函数,该函数查找集合中的第一个匹配元素。它可能会找到它,然后返回它,或者找不到任何东西。

docs给出了更多情况:

  
      
  • 初始值
  •   
  • 未在其整个输入范围内定义的功能(部分功能)的返回值
  •   
  • 否则将报告简单错误的返回值,其中错误返回None
  •   
  • 可选结构字段
  •   
  • 可借用或“占用”的结构字段
  •   
  • 可选函数参数
  •   
  • 可空指针
  •   
  • 从困难中摆脱困境
  •   

现在,您可能会问:为什么我们不使用这些值之一来标记一个空值?有两个原因:

  • 在某些情况下,您没有有效的“零值”或有效的“无效”值。在这种情况下,您必须在其他位置使用一些标志来存储某些无效的事实。

  • 通常,在各处使用相同的解决方案比标记和记录“ none”值要简单得多。

  

为什么有人会宣布它不存在?

这与初始化/未初始化的值不同。 Option只是一种类型,其中包含“无”(None)或某种类型的“值”(Some(value)

您可以从概念上将其视为struct,带有标志和值本身的空白。

  

也请解释一下,在初始声明期间或什么时候我获得一些值时,会在什么时候为我分配内存?

这取决于实现方式。可以决定使用指向该值的指针来实现Option,这意味着它可能会延迟分配。

但是,最可能的实现是避免使用指针,并保留该值和一个额外的标志。请注意,对于某些类型,您还可以进一步优化并完全避免使用该标志。例如,如果您有一个指针Option,则可以简单地将None的值设为零。实际上,Rust对Option<Box<T>>之类的类型做了这样的事情。