【问题标题】:How to make a compile time error if an enum variant is passed to a function如果将枚举变体传递给函数,如何产生编译时错误
【发布时间】:2016-01-09 07:10:16
【问题描述】:

假设我有一个enum:

enum Foobar {
    Foo(i32),
    Bar(f64)
}

我还有一个以Foobar 为参数的函数:

fn foo(x: &mut Foobar) {
    match x {
        Foobar::Foo(i32) => { /* do something */ },
        Foobar::Bar(f64) => { /* panic */ }
    }
}

如果函数的调用者在不使用编译器插件的情况下将Bar 变体传递给函数,是否可能引发编译时错误?

【问题讨论】:

    标签: enums rust


    【解决方案1】:

    没有。

    即使是编译器插件(我假设您的意思是“lint”)也不可能涵盖所有情况。

    如果你想让它静态地不可能将特定的数据块传递给函数,那么更改类型使其实际上无效:定义 Foobar 的同级t 有 Bar 变体,以及两者之间的一些转换。

    在 Rust 中没有简单或自动的方法来做到这一点;你只需要做困难的yakka。或者等待细化类型,但我不建议这样做。

    【讨论】:

    • 在这种情况下,我只能什么也不做或恐慌,因为我是该功能的唯一用户。感谢您的帮助。
    • @pengowen123 如果您是该函数的唯一用户,您可以将 Foo 和 Bar 设为两个单独的结构,并在您想要接受其中任何一个时定义一个枚举,例如 example跨度>
    • 我正在使用enum 来存储类型略有不同的向量。是否可以在您的示例中做类似的事情,但作为enum 上的一种方法?
    • @pengowen123 如果你想回复某人,你应该在开头提到他们的名字,否则他们可能永远不会知道。我不确定你在这里到底要什么,但我不这么认为。 Vec 只能有 one 元素类型,这可能是枚举,并且枚举不能假定一个变体或另一个没有被使用。
    猜你喜欢
    • 2012-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-04
    • 2011-12-04
    • 1970-01-01
    相关资源
    最近更新 更多