Types Rust中参数化类型的匹配
在一个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),等等)都是无效的。在
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) => /* ... */,
}
}
}