Pregunta ¿Por qué puedo usar Ok y Err directamente sin el prefijo Result ::?


Por ejemplo:

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

Tengo que escribir Foobar::Foo() en lugar de simplemente Foo(), pero solo puedo escribir Ok() sin Result::. ¿Porqué es eso? Tengo la misma pregunta para Some y None.


7
2018-06-25 05:14


origen


Respuestas:


UN use el elemento puede agregar variantes de enumeración a un espacio de nombre, de modo que no tenga que prefijarlas por el nombre de la enumeración.

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

La razón por la cual Ok, Err, Some y None están disponibles sin calificación es que el preludio Tiene algunos use elementos que agregan estos nombres al preludio (además de los enums mismos):

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

11
2018-06-25 05:21