2016-11-10 76 views
1

是否可以在多种类型的Rust生成模式匹配?看起来好像你不能。如果没有,是否有计划的支持来添加它或运行时类型信息(RTTI)?与多种类型匹配的生锈模式

struct Bus; 
struct Car; 
struct Person; 

fn main() { 
    let x = Bus; 
    //or more realistically, let x = function_with_multiple_return_types(); 

    match x { 
     Car => { 
      // ... 
     } 
     Bus => { 
      // this gets executed 
     } 
     Person => { 
      // ... 
     } 
    } 
} 

这个例子是微不足道的。在现实生活中,只有当x可以是多种类型时才有用。例如let x = function_with_multiple_return_types();。正如Shepmaster所说,这是不可能的,因为Rust是静态类型的,与Lisp不同。

+0

Idk Rust,但我希望匹配的每个子句都需要是相同的类型。尽量让它们成为同一个超类/界面的一部分 – Carcigenicate

+0

您可以得到的最接近的东西可能是标记联合,如示例[here](https://doc.rust-lang.org/book/enums.html)。 – squiguy

回答

2

没有人能够100%准确说,一个功能会或不会永远实现,但我可以用100%的信念说,这将永远不会被执行。

这是为什么?因为建议的语法没有任何好处。 Rust是一个静态类型语言。这意味着编译器知道变量的类型是什么。除了Bus之外,任何分支都不可能执行。没有办法,一个变量可以有多个类型!为什么会改变语言以允许您添加永远不会使用的代码?这不会很有用。

匹配语句和模式匹配通常只在存在多种可能的变体时才有用。这就是为什么Rust有enum s;以允许一组固定的动态选择(也称作运行时)。

如果您需要一套开放的动态决策,那就是特质(也许是专业化)的用处。甚至有一个特征允许any concrete type

+0

谢谢你的回答。 – randyrand

+0

我的问题受到我写的一个Racket解释器的启发,其中Match可以在不同类型上分支。不过,Lisp当然是动态类型的,所以它在Rust中是有意义的,这通常不是很有用。我觉得在那里可以有一些利基的情况下动态返回类型可能是有用的(虽然不是idomatic) - std :: any似乎大多覆盖了这个用例。谢谢! – randyrand

+0

动态类型化的Lisp是我最初的困惑所在。 – randyrand