为什么我可以在没有Result ::前缀的情况下直接使用Ok和Err?

EFa*_*nZh 7 enums rust

例如:

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!
}
Run Code Online (Sandbox Code Playgroud)

我必须写Foobar::Foo()而不是只是Foo(),但我可以写Ok()没有Result::.这是为什么?我有同样的问题SomeNone.

Fra*_*gné 11

一个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!
}
Run Code Online (Sandbox Code Playgroud)

之所以Ok,Err,SomeNone提供无条件的是,前奏有一些use项目,这些名称添加到前奏(除枚举本身):

pub use option::Option::{self, Some, None};
pub use result::Result::{self, Ok, Err};
Run Code Online (Sandbox Code Playgroud)