Types Rust中参数化类型的匹配

Types Rust中参数化类型的匹配,types,pattern-matching,rust,Types,Pattern Matching,Rust,在一个Rust程序中,我有一个用例,我想打印一个数字或一个管道分隔的数字向量,因此这个简单的包装枚举: pub enum OneOrMore<T> { One(T), More(Vec<T>) } 由于impl是参数化的,所以它需要一个One,但我的代码描述的是一个One。问题是我不知道把type参数放在match arms中的什么位置。没有给出参数化类型匹配的示例,fmt本身不接受类型参数,我所有的盲目猜测(One(x:t),One(x),等等)都是无效的。在

在一个Rust程序中,我有一个用例,我想打印一个数字或一个管道分隔的数字向量,因此这个简单的包装枚举:

pub enum OneOrMore<T> {
  One(T),
  More(Vec<T>)
}

由于
impl
是参数化的,所以它需要一个
One
,但我的代码描述的是一个
One
。问题是我不知道把type参数放在match arms中的什么位置。没有给出参数化类型匹配的示例,
fmt
本身不接受类型参数,我所有的盲目猜测(
One(x:t)
One(x)
,等等)都是无效的。在我应该指出匹配臂类型的地方有什么想法吗?

match
表达式中,
self
类型为
&OneOrMore
,但臂模式类型为
OneOrMore
;i、 e.您在参考上匹配,但手臂不是参考

您可以将模式更改为引用:

impl<T: Show> Show for OneOrMore<T> {
  fn fmt(&self, f: &mut Formatter) -> Result<(), Error> {
    match self {
      &One(ref x) => x.fmt(f),
      &More(ref xs) => /* ... */,
    }
  }
}

请注意,在这两种情况下,我们都需要在
x
xs
绑定上添加
ref
关键字,以创建对
一个或多个内部的引用。换句话说,如果没有
ref
x
xs
将是
T
类型;对于
ref
,它们属于
&T
类型。没有
ref
,编译器抱怨我们试图从
one或more
中移出一个或多个
,这是通过借用不允许的。

谢谢,这次我完全误解了编译器错误。标准的Rust样式是
match*foo{Bar=>()}
,而不是
match foo{&Bar=>()}
,顺便提一下,尽管对于匹配的表达式是元组的情况,如
match(self,other){(&Foo,&Foo)=>()}
,这一点不能保持不变。
impl<T: Show> Show for OneOrMore<T> {
  fn fmt(&self, f: &mut Formatter) -> Result<(), Error> {
    match self {
      &One(ref x) => x.fmt(f),
      &More(ref xs) => /* ... */,
    }
  }
}
impl<T: Show> Show for OneOrMore<T> {
  fn fmt(&self, f: &mut Formatter) -> Result<(), Error> {
    match *self {
      One(ref x) => x.fmt(f),
      More(ref xs) => /* ... */,
    }
  }
}