例如:

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

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

推荐答案

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

OkErrSomeNone之所以可以不加限制地使用,是因为prelude有大约use个项目将这些名称添加到序曲中(除了枚举本身):

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

Rust相关问答推荐

移植带有可变borrow 的C代码-卸载期间错误(nappgui示例)

如何容器化Linux上基于Rust的Windows应用程序的编译过程?

"value is never read警告似乎不正确.我应该忽略它吗?

在Rust中宏的表达式中提取对象

不能在一个代码分支中具有不变的自身borrow ,而在另一个代码分支中具有可变的self borrow

是否可以在不切换到下一个位置的情况下获得迭代器值:

如何在AVX2中对齐/旋转256位向量?

根据填充系数以相对大小在给定空间中布局项目

为什么 tokio 在以奇怪的方式调用时只运行 n 个任务中的 n-1 个?

如何在 `connect_activate()` 之外创建一个 `glib::MainContext::channel()` 并将其传入?

Rust 中的 Option as_ref 和 as_deref 有什么不同

为什么 for_each 在释放模式(cargo run -r)下比 for 循环快得多?

在运行时在 Rust 中加载字体

判断对象是 PyDatetime 还是 Pydate 的实例?

使用部分键从 Hashmap 中检索值

发生移动是因为 `data` 的类型为 `Vec`,它没有实现 `Copy` 特性

如何将切片推入数组?

实现不消费的迭代器

当引用不再被borrow 时,Rust 不会得到它

在 Rust 中组合特征的不同方法是否等效?