gpt4 book ai didi

types - 在 Rust 中匹配参数化类型

转载 作者:行者123 更新时间:2023-11-29 08:05:38 25 4
gpt4 key购买 nike

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

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

效果很好。但后来我想将格式逻辑移到 OneOrMore 中类型,所以我尝试了:

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

impl被参数化,它期待一个 One<T>但我的代码描述了一个 One<_> .问题是我无法弄清楚将类型参数放在火柴臂中的什么位置。 syntax guide没有给出参数化类型匹配的例子,fmt本身不接受类型参数,我所有的盲目猜测( One(x: T)One<T>(x) 等)都不是有效的 Rust。有什么想法我应该指出火柴武器的类型吗?

最佳答案

match表达式,self类型为 &OneOrMore<T> , 但 ARM 图案的类型是 OneOrMore<T> ;也就是说,您正在匹配引用,但 ARM 不是引用。

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

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) => /* ... */,
}
}
}

或者您可以避免重复 &通过取消引用 self相反:

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) => /* ... */,
}
}
}

请注意,在这两种情况下,我们都需要添加 ref x 上的关键字和 xs绑定(bind)以创建对 OneOrMore 的引用的内部。换句话说,没有 ref , xxs类型为 T ;与 ref , 它们的类型是 &T .没有 ref , 编译器提示我们正试图从 OneOrMore 中移出一个值, 这是不允许借用的。

关于types - 在 Rust 中匹配参数化类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27285866/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com