Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 我如何在多态类型上调用Display trait?_Rust - Fatal编程技术网

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错误:trait
Employee
没有为类型
团队成员实现trait
[E0277]/home/dastoor/rust\u示例/polymorphic\u display\u trait.r