pub struct Table<T> {
table: Vec<Vec<T>>
}
impl<i32> Display for Table<i32>
where i32: Display
{
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
for (index, line) in self.table.iter().enumerate() {
write!(f, "{}:\t", index+1);
let mut sum = 0i32;
for task in line {
write!(f, "{} ", task);
sum += *task;
}
write!(f, " : {}\n", sum);
}
Result::Ok(())
}
}
此代码会导致令人困惑的错误消息:
error[E0308]: mismatched types
--> src/table.rs:48:24
|
48 | sum += *task;
| ^^^^^ expected i32, found type parameter
|
= note: expected type `i32` (i32)
= note: found type `i32` (type parameter)
而且我不知道该怎么做。
答案 0 :(得分:4)
您不小心引入了名为i32
的类型参数(而不是T
)。我同意你的意见,编译器诊断可能会更好。
在尖括号中添加impl
之后的内容,喜欢这样:
impl<i32> Display for Table<i32>
...将始终引入一个新的类型参数,就像例如impl<T>
。要解决您的问题,只需从impl
关键字中删除此类型参数声明:
impl Display for Table<i32> { ... }
请注意,我还删除了不再有意义的where
界限。您不能将边界应用于具体类型。
相关: