2017-06-25 40 views
5

Na przykład:Dlaczego mogę używać Ok i Err bezpośrednio bez przedrostka Result ::?

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! 
} 

muszę napisać Foobar::Foo() zamiast tylko Foo(), ale mogę tylko napisać Ok() bez Result::. Dlaczego? Mam takie samo pytanie dla Some i None.

Odpowiedz

9

Pozycja use może dodawać odmiany enum do przestrzeni nazw, dzięki czemu nie trzeba poprzedzać ich nazwami wyliczonymi.

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! 
} 

Powodem Ok, Err, Some i None są dostępne bez kwalifikacji jest fakt, że prelude ma pewne use przedmioty, które dodają te nazwy do preludium (oprócz teksty stałe siebie):

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