首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >`[T]‘不能用默认格式化程序格式化

`[T]‘不能用默认格式化程序格式化
EN

Stack Overflow用户
提问于 2022-07-29 12:20:11
回答 1查看 361关注 0票数 0

我正在通过一个教育项目学习锈学,在那里我希望实现数学矩阵和向量。我这么做是为了学习锈病。在我的显示函数中显示一个通用类型的片段时,我遇到了问题。

这里我的Vector.rs文件是这样的:

代码语言:javascript
复制
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);
}

编译时,我会遇到以下错误

代码语言:javascript
复制
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具有显示功能。

我想做的事是不可能的吗?我有没有吃过面包片?谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-29 12:58:56

Display是针对最终用户的,Debug是针对开发人员的。

通常,给最终用户的消息不包括向量的表示,因此Vec/Slice不实现Display。它们只能通过Debug打印。

由于您的结构实际上是要显示给最终用户的,所以您需要自己为它实现Display,方法是实际序列化每个元素,然后以您喜欢的方式加入和格式化它们。

例如,如下所示:

代码语言:javascript
复制
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);
}
代码语言:javascript
复制
[0.1, 0.2, 0.3, 0.4]
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73166648

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档