考虑此示例
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
分配了什么内存?
我可能会问一个愚蠢的问题,但想了解这个概念的必要性。
答案 0 :(得分:3)
缺少值在实践中如何有用?
一个简单的示例是一个函数,该函数查找集合中的第一个匹配元素。它可能会找到它,然后返回它,或者找不到任何东西。
docs给出了更多情况:
- 初始值
- 未在其整个输入范围内定义的功能(部分功能)的返回值
- 否则将报告简单错误的返回值,其中错误返回None
- 可选结构字段
- 可借用或“占用”的结构字段
- 可选函数参数
- 可空指针
- 从困难中摆脱困境
现在,您可能会问:为什么我们不使用这些值之一来标记一个空值?有两个原因:
在某些情况下,您没有有效的“零值”或有效的“无效”值。在这种情况下,您必须在其他位置使用一些标志来存储某些无效的事实。
通常,在各处使用相同的解决方案比标记和记录“ none”值要简单得多。
为什么有人会宣布它不存在?
这与初始化/未初始化的值不同。 Option
只是一种类型,其中包含“无”(None
)或某种类型的“值”(Some(value)
)
您可以从概念上将其视为struct
,带有标志和值本身的空白。
也请解释一下,在初始声明期间或什么时候我获得一些值时,会在什么时候为我分配内存?
这取决于实现方式。可以决定使用指向该值的指针来实现Option
,这意味着它可能会延迟分配。
但是,最可能的实现是避免使用指针,并保留该值和一个额外的标志。请注意,对于某些类型,您还可以进一步优化并完全避免使用该标志。例如,如果您有一个指针Option
,则可以简单地将None
的值设为零。实际上,Rust对Option<Box<T>>
之类的类型做了这样的事情。