为什么我可以直接使用Ok和Err而不需要Result::前缀?

12
例如:
enum Foobar {
    Foo(i32),
    Bar(i32),
}

fn main() {
    let a: Result<i32, i32> = Result::Ok(1);
    let b: Result<i32, i32> = Ok(1);
    let c: Foobar = Foobar::Foo(1);
    let d: Foobar = Foo(1); // Error!
}

我必须写Foobar::Foo()而不是只写Foo(),但我可以只写Ok()而不需要Result::。为什么会这样?我对SomeNone也有同样的问题。

1个回答

17

use语句可以将枚举变体添加到命名空间中,这样您就不必使用枚举名称作为前缀。

use Foobar::*;

enum Foobar {
    Foo(i32),
    Bar(i32)
}

fn main() {
    let a: Result<i32, i32> = Result::Ok(1);
    let b: Result<i32, i32> = Ok(1);
    let c: Foobar = Foobar::Foo(1);
    let d: Foobar = Foo(1); // Not an error anymore!
}

之所以可以无需限定词直接使用OkErrSomeNone,是因为预导入模块prelude中包含了一些use语句将这些名称添加到预导入模块中(除了枚举本身)。

pub use option::Option::{self, Some, None};
pub use result::Result::{self, Ok, Err};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接