是否有一些编译器内置功能正在运行,或者是否有可能实现您自己的枚举及其可仅通过 Rust 代码全局访问的变体?如果是,怎么办?
编辑:抱歉,如果我不清楚。我的问题是关于Some
和None
,而不是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
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)
归档时间: |
|
查看次数: |
500 次 |
最近记录: |