无法为具有通用类型的结构体实现fmt :: Display

5

我有一个接受泛型类型T的结构体Character。我无法想出如何为Character实现fmt::Display特征。这是我尝试过的:

pub struct Character<T> {
    pub name: String,
    pub level: u32,
    pub class: T,
    pub attack: i32,
    pub defense: i32,
    pub speed: i32,
}

impl fmt::Display for Character<T> {
    // Display trait for Player
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "[{}] {} (Lv {})", self.class, self.name, self.level)
    }
}

错误提示显示在代码行impl fmt :: Display for Character <T>中,T在作用域中找不到。
我已经尝试搜索如何解决此问题,但是我无法弄清楚。

总结原因和解决方案:仅仅因为对象本身(Character<T>)应该实现Display,并不意味着T也应该这样做,所以如果你只让Character<T> where T: Display实现Display,就不会出错了。 - Optimistic Peach
1个回答

13
use std::fmt;

impl<T> fmt::Display for Character<T>
where
    T: fmt::Display,
{
    // Display trait for Player
    fn fmt(&self, f: &mut std::fmt::Formatter) -> fmt::Result {
        write!(f, "[{}] {} (Lv {})", self.class, self.name, self.level)
    }
}
  • impl<T> 表示以下内容是针对某个通用类型(例如Character)的实现。
  • where T: std::fmt::Display 要求 T 实现了Display。这是必需的,因为您想要写入self.class,其类型为T

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接