Rust 怎么规定函数返回类型为 enum 的一个特定 variant

enum E {
    A(isize),
    B(isize)
}

fn get_A() -> E {
    E::A(1)
}

fn main() {
    let E::A(a) = get_A(); // refutable pattern in local binding: `B(_)` not covered
}

怎么让编译器知道 get_A 就只会返回 E::A。

如果不行,能不能把他的返回值强制断言成 E::A。

如果确实不行,能不能提供一下别的建议。

谢谢

阅读 2.3k
1 个回答

请尝试通过 newtype 模式 来构建:

trait EnumTrait {}

struct A(isize);
impl EnumTrait for A {}

struct B(isize);
impl EnumTrait for B {}

// 利用返回参数 `impl` 语法简化泛型写法,相当于
// fn<T: EnumTrait> get_a() -> T
fn get_a() -> impl EnumTrait {
    A(42_isize)
}

fn main() {
    let A(a) = get_A();

    // rust 1.58 支持直接捕获上下文中的变量
    println!("{a}");
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进