如何在任何范围内访问“Option”中的“Some”和“None”?

rak*_*rak 2 rust

是否有一些编译器内置功能正在运行,或者是否有可能实现您自己的枚举及其可仅通过 Rust 代码全局访问的变体?如果是,怎么办?

编辑:抱歉,如果我不清楚。我的问题是关于SomeNone,而不是Option。例如:

enum MyOption<T> {
    MySome(T),
    MyNone,
}

impl<T> MyOption<T> {
    fn is_some(&self) -> bool {
        match self {
            Self::MySome(_) => true,
            Self::MyNone => false,
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

即使从“内部”,我也必须告诉编译器在Self. 那么有没有一种方法可以做到这一点,Option并让我的MySome和从我写的任何地方MyNone链接到它们?MyOption

cam*_*024 6

Rust 有一个名为“prelude”的模块,可在 访问std::prelude,并且默认情况下将其所有成员导入到每个模块中。

如果您定义的自己的名称与前奏中的名称相同,则您的名称优先。这对于诸如 之类的类型很常见Result,其模式如下:

type Result<T> = std::result::Result<T, MyCustomError>;
Run Code Online (Sandbox Code Playgroud)

只要它在范围内,它就优先于Result前奏中包含的类型。

请注意,编译器以特殊方式处理序言中的某些内容(例如Box具有内置功能),但您仍然可以覆盖名称。

您可以像常规项目一样导入枚举变体。例如,你可以写:

use MyOption::*;

fn handle_my_option(o: MyOption) {
  match o {
    MyOk(foo) => {},
    MyNone => {},
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,您不能像前奏中那样自动导入这些内容(本质上您不能在前奏中添加任何内容)。

如果您有很多这些类型,您可以将它们捆绑到一个文件中并全局导入它们:

// src/my_prelude.rs
pub use crate::my_option::MyOption;  // reexport the enum itself
pub use crate::my_option::MyOption::*;  // reexport the individual variants
// any other things you want everywhere

// src/foo.rs
use crate::my_prelude::*;

fn foo() -> MyOption<()> {
  if bar() {
    MySome(()),
  } else {
    MyNone
  }
}
Run Code Online (Sandbox Code Playgroud)