我正在通过一个教育项目学习锈学,在那里我希望实现数学矩阵和向量。我这么做是为了学习锈病。在我的显示函数中显示一个通用类型的片段时,我遇到了问题。
这里我的Vector.rs文件是这样的:
use std::fmt;
#[derive(Debug)]
struct Vector<'a, K> {
data: &'a [K]
}
impl<'a, K> Vector<'a, K> {
fn new(data: &'a [K]) -> Vector<'a, K> {
Vector {
data: data
}
}
fn len(&self) -> usize {
self.data.len()
}
}
impl<'a, K> fmt::Display for Vector<'a, K>
where K: std::fmt::Display {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", self.data)
}
}
fn main() {
println!("Test File for Vectors");
let mut v = [0.1, 0.2, 0.3, 0.4];
let my_v = Vector::new(&v);
}编译时,我会遇到以下错误
error[E0277]: `[K]` doesn't implement `std::fmt::Display`
--> Vector.rs:22:19
|
22 | write!(f, "{}", self.data)
| ^^^^^^^^^ `[K]` cannot be formatted with the default formatter
|这个错误是说我需要为[K]类型实现显示,但我不理解。在这里,我的类型K是f64,所以显示是存在的,我还添加了行where K: std::fmt::Display,以确保类型K具有显示功能。
我想做的事是不可能的吗?我有没有吃过面包片?谢谢。
发布于 2022-07-29 12:58:56
Display是针对最终用户的,Debug是针对开发人员的。
通常,给最终用户的消息不包括向量的表示,因此Vec/Slice不实现Display。它们只能通过Debug打印。
由于您的结构实际上是要显示给最终用户的,所以您需要自己为它实现Display,方法是实际序列化每个元素,然后以您喜欢的方式加入和格式化它们。
例如,如下所示:
use std::fmt;
#[derive(Debug)]
struct Vector<'a, K> {
data: &'a [K],
}
impl<'a, K> Vector<'a, K> {
fn new(data: &'a [K]) -> Vector<'a, K> {
Vector { data: data }
}
}
impl<'a, K> fmt::Display for Vector<'a, K>
where
K: std::fmt::Display,
{
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let formatted_elements = self
.data
.iter()
.map(|el| format!("{}", el))
.collect::<Vec<_>>();
let elements = formatted_elements.join(", ");
write!(f, "[{}]", elements)
}
}
fn main() {
let v = [0.1, 0.2, 0.3, 0.4];
let my_v = Vector::new(&v);
println!("{}", my_v);
}[0.1, 0.2, 0.3, 0.4]https://stackoverflow.com/questions/73166648
复制相似问题