Rust 我如何在多态类型上调用Display trait?
我有:Rust 我如何在多态类型上调用Display trait?,rust,Rust,我有: 使用std::fmt; 结构团队成员{ 名称:String, 年龄:32岁,, } 结构管理器{ 名称:String, 年龄:32岁,, } impl fmt::为团队成员显示{ fn fmt(&self,f:&mut fmt::Formatter)->fmt::Result{ 写!(f,“TeamMember;name=>{},age=>{}”,self.name,self.age) } } impl fmt::管理器的显示{ fn fmt(&self,f:&mut fmt::Form
使用std::fmt;
结构团队成员{
名称:String,
年龄:32岁,,
}
结构管理器{
名称:String,
年龄:32岁,,
}
impl fmt::为团队成员显示{
fn fmt(&self,f:&mut fmt::Formatter)->fmt::Result{
写!(f,“TeamMember;name=>{},age=>{}”,self.name,self.age)
}
}
impl fmt::管理器的显示{
fn fmt(&self,f:&mut fmt::Formatter)->fmt::Result{
写!(f,“Manager;name=>{},age=>{}”,self.name,self.age)
}
}
特征雇员{}
impl fmt::为员工显示{
fn fmt(&self,f:&mut fmt::Formatter)->fmt::Result{
写!(f,“{},*self)
}
}
fn main(){
让t=TeamMember{name:“abc.”to_string(),年龄:23};
设t2=Manager{name:“xyz.”to_string(),年龄:18};
让mut v:Vec=Vec::new();
v、 推送&t;
v、 推送(&t2);
为it在&v{
println!(“我是一个{},*它);
}
}
我想多态地调用trait对象向量引用的2个具体类型的显示。我得到以下编译错误:
:2:21:2:52错误:没有为“Employee”类型实现trait“core::marker::Sized”[E0277]
:2元。写入(格式参数!($($arg)*))
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
:2:21:2:52注意:在格式的扩展中\u args!
向量迭代应该调用具体类型的显示函数…编写以下内容时:
use std::fmt;
struct TeamMember {
name: String,
age: u32,
}
struct Manager {
name: String,
age: u32,
}
impl fmt::Display for TeamMember {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "TeamMember; name => {}, age => {}", self.name, self.age)
}
}
impl fmt::Display for Manager {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "Manager; name => {}, age => {}", self.name, self.age)
}
}
trait Employee {}
impl fmt::Display for Employee {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", *self)
}
}
fn main() {
let t = TeamMember { name: "abc".to_string(), age: 23 };
let t2 = Manager { name: "xyz".to_string(), age: 18 };
let mut v: Vec<&Employee> = Vec::new();
v.push(&t);
v.push(&t2);
for it in &v {
println!("i am a {}", *it);
}
}
您假定*self
(即Employee
)的类型实现了显示
,但类型约束不能保证这一点。所以你应该:
write!(f, "{}", *self)
作为一种副作用,它允许您在编写以下内容时删除impl fmt::Display for Employee
:
use std::fmt;
struct TeamMember {
name: String,
age: u32,
}
struct Manager {
name: String,
age: u32,
}
impl fmt::Display for TeamMember {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "TeamMember; name => {}, age => {}", self.name, self.age)
}
}
impl fmt::Display for Manager {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "Manager; name => {}, age => {}", self.name, self.age)
}
}
trait Employee {}
impl fmt::Display for Employee {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", *self)
}
}
fn main() {
let t = TeamMember { name: "abc".to_string(), age: 23 };
let t2 = Manager { name: "xyz".to_string(), age: 18 };
let mut v: Vec<&Employee> = Vec::new();
v.push(&t);
v.push(&t2);
for it in &v {
println!("i am a {}", *it);
}
}
您假定*self
(即Employee
)的类型实现了显示
,但类型约束不能保证这一点。所以你应该:
write!(f, "{}", *self)
作为一个副作用,它允许您删除impl fmt::Display for Employee
这终于起作用了,谢谢:
trait Employee: fmt::Display {}
使用std::fmt;
结构团队成员{
名称:String,
年龄:32岁,,
}
结构管理器{
名称:String,
年龄:32岁,,
}
impl fmt::为团队成员显示{
fn fmt(&self,f:&mut fmt::Formatter)->fmt::Result{
写!(f,“TeamMember!”;name=>{},age=>{},self.name,self.age)
}
}
impl fmt::管理器的显示{
fn fmt(&self,f:&mut fmt::Formatter)->fmt::Result{
写!(f,“Manager!”;name=>{},age=>{},self.name,self.age)
}
}
trait Employee:fmt::Display{}
团队成员{}的impl员工
经理{}的impl员工
fn main(){
让t=团队成员{
名称:“abc”。to_string(),
年龄:23,,
};
设t2=管理器{
名称:“xyz”。to_string(),
年龄:18岁,
};
让mut v:Vec=Vec::new();
v、 推送&t;
v、 推送(&t2);
为it在&v{
println!(“我是一个{},*它);
}
}
这终于奏效了,谢谢:
trait Employee: fmt::Display {}
使用std::fmt;
结构团队成员{
名称:String,
年龄:32岁,,
}
结构管理器{
名称:String,
年龄:32岁,,
}
impl fmt::为团队成员显示{
fn fmt(&self,f:&mut fmt::Formatter)->fmt::Result{
写!(f,“TeamMember!”;name=>{},age=>{},self.name,self.age)
}
}
impl fmt::管理器的显示{
fn fmt(&self,f:&mut fmt::Formatter)->fmt::Result{
写!(f,“Manager!”;name=>{},age=>{},self.name,self.age)
}
}
trait Employee:fmt::Display{}
团队成员{}的impl员工
经理{}的impl员工
fn main(){
让t=团队成员{
名称:“abc”。to_string(),
年龄:23,,
};
设t2=管理器{
名称:“xyz”。to_string(),
年龄:18岁,
};
让mut v:Vec=Vec::new();
v、 推送&t;
v、 推送(&t2);
为it在&v{
println!(“我是一个{},*它);
}
}
既然员工
没有方法,就没有必要创造另一种特质。您可以直接使用Display
:
use std::fmt;
struct TeamMember {
name: String,
age: u32,
}
struct Manager {
name: String,
age: u32,
}
impl fmt::Display for TeamMember {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "TeamMember!; name => {}, age => {}", self.name, self.age)
}
}
impl fmt::Display for Manager {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "Manager!; name => {}, age => {}", self.name, self.age)
}
}
trait Employee: fmt::Display {}
impl Employee for TeamMember {}
impl Employee for Manager {}
fn main() {
let t = TeamMember {
name: "abc".to_string(),
age: 23,
};
let t2 = Manager {
name: "xyz".to_string(),
age: 18,
};
let mut v: Vec<&Employee> = Vec::new();
v.push(&t);
v.push(&t2);
for it in &v {
println!("i am a {}", *it);
}
}
如果您想拥有一个不需要执行显示的员工
特质(如中所要求),您可以创建另一个特质,该特质同时需要:
use std::fmt::Display;
fn main() {
let t = TeamMember { name: "abc".to_string(), age: 23 };
let t2 = Manager { name: "xyz".to_string(), age: 18 };
let v = vec![&t as &Display, &t2];
for it in &v {
println!("i am a {}", *it);
}
}
使用std::fmt::Display;
特征雇员{}
团队成员{}的impl员工
经理{}的impl员工
trait PrintableEmployee:Employee+Display{}
T的impl PrintableEmployee,其中T:Employee+Display{}
fn main(){
让t=TeamMember{name:“abc.”to_string(),年龄:23};
设t2=Manager{name:“xyz.”to_string(),年龄:18};
设v=vec![&t as&PrintableEmployee,&t2];
为it在&v{
println!(“我是一个{},*它);
}
}
既然员工
没有方法,就没有必要创造另一种特质。您可以直接使用Display
:
use std::fmt;
struct TeamMember {
name: String,
age: u32,
}
struct Manager {
name: String,
age: u32,
}
impl fmt::Display for TeamMember {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "TeamMember!; name => {}, age => {}", self.name, self.age)
}
}
impl fmt::Display for Manager {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "Manager!; name => {}, age => {}", self.name, self.age)
}
}
trait Employee: fmt::Display {}
impl Employee for TeamMember {}
impl Employee for Manager {}
fn main() {
let t = TeamMember {
name: "abc".to_string(),
age: 23,
};
let t2 = Manager {
name: "xyz".to_string(),
age: 18,
};
let mut v: Vec<&Employee> = Vec::new();
v.push(&t);
v.push(&t2);
for it in &v {
println!("i am a {}", *it);
}
}
如果您想拥有一个不需要执行显示的员工
特质(如中所要求),您可以创建另一个特质,该特质同时需要:
use std::fmt::Display;
fn main() {
let t = TeamMember { name: "abc".to_string(), age: 23 };
let t2 = Manager { name: "xyz".to_string(), age: 18 };
let v = vec![&t as &Display, &t2];
for it in &v {
println!("i am a {}", *it);
}
}
使用std::fmt::Display;
特征雇员{}
团队成员{}的impl员工
经理{}的impl员工
trait PrintableEmployee:Employee+Display{}
T的impl PrintableEmployee,其中T:Employee+Display{}
fn main(){
让t=TeamMember{name:“abc.”to_string(),年龄:23};
设t2=Manager{name:“xyz.”to_string(),年龄:18};
设v=vec![&t as&PrintableEmployee,&t2];
为it在&v{
println!(“我是一个{},*它);
}
}
我试过你说的话,即从fmt:Display中删除impl fmt::Display for Employee和extended Employee,但不起作用。现在我得到=>rustc/home/dastoor/rust\u examples/polymorphic\u Display\u trait.rs/home/dastoor/rust\u examples/polymorphic\u Display\u trait.rs:40:12:40:14错误:traitEmployee
没有为类型团队成员实现trait[E0277]/home/dastoor/rust\u示例/polymorphic\u display\u trait.r