< 返回版块

LArctic 发表于 2019-10-17 05:09

看的是kaisery.github.io的文档,因为会点脚本,所以前5章学的十分顺滑。第6章枚举也看的通,但到了末尾的"Option"我就懵了。

于是我脱离教程,开始搜索相关的内容。

经过数倍于前面的学习时间,我总结了下我所知道的关于"Option"的一切:

如何判断变量X是不是空值?不知道。

Some(5)是干啥的?不知道

<`T>什么意思?T是泛型,<>表示内部是泛型参数。

那么如果<>表示内部是泛型参数,为啥要"T",不能是A-Z呢?不知道

我想问,这部分能跳过吗?感觉超级沮丧。

评论区

写评论
Nalleyer 2019-10-17 10:15

技术楼上都说了,我自说自话说点设计意图。希望有所帮助。 option建模了可能空的值后,逼迫程序员在所有可能为空的地方都进行处理。 如果没有Option类型,例如在一些语言中,所有值都可能为空,在语意的表达上就有所欠缺——我光看函数的类型不知道它会不会返回空,必须看实现才知道。最后反而bug满天飞。

作者 LArctic 2019-10-17 08:55

谢谢大家,谢谢 @fcbldopb 的示例。 跳过这里,通读了一遍语法部分,也基本上理解了这个特殊枚举的作用。 现在理顺了语法,再看看内置库,应该就可以摸索着写代码了。

Mike Tang 2019-10-17 06:48

与Some对应的是None,就用这个来判断是不是空值(如果你要定义所谓空值的话)。

Mike Tang 2019-10-17 06:46

Some是一个enum。

T就是一个代号,也可以是A~Z。一般用T,表示这里是一个type的意思。

fcbldopb 2019-10-17 06:32

option 和 result本质是enum ,T 默认为所有rust类型, 像result需要俩个就使用了 T 和 E

fcbldopb 2019-10-17 06:26
enum MyOption<A> {
    None,
    Some(A),
}
enum MyResult<T, E> {
    Ok(T),
    Err(E),
}
fn main() {
    let option_my = MyOption::Some(123);
    match option_my {
        MyOption::Some(x) => {
            println!("非空,值为{}", x);
        }
        MyOption::None => {
            println!("为空!");
        }
    }
    let option_my_none = MyOption::<i32>::None;
    if let MyOption::None = option_my_none {
        println!("option_std_none 为空");
    }

    let mut option_std = Some(456);
    dbg!(option_std);

    if let Some(x) = option_std {
        println!("option_std {}", x);
    }
    //取走值,变为空
    let val= option_std.take();
    dbg!(option_std);
    dbg!(val);
}
  
1 共 6 条评论, 1 页