< 返回版块

kcrazy 发表于 2021-04-01 10:24

Tags:Arc,Mutex,dyn,trait,struct,object

如下代码所示:

use std::sync::{Arc, Mutex};

/* ITrait 接口 */
pub trait ITrait: Sync + Send {
    fn abc(&self);
}

/* 具体对象 A */
pub struct A {
    hello: String,
}

impl ITrait for A {
    fn abc(&self) {
        println!("abc!");
    }
}

/* A 的特有方法 */
impl A {
    pub fn test(&self) {
        println!("{}", self.hello);
    }
}

fn main() {
    let x: Arc<Mutex<dyn ITrait>> = Arc::new(Mutex::new(A {
        hello: "Hello World!".to_string(),
    }));

    /* 
     * 这里我想把 trait x,转换为 具体对象 Arc<Mutex<A>>,
     * 并调用 A 的test 方法,应该怎么做? 非常感谢!
     */
    x.test();
}

评论区

写评论
作者 kcrazy 2021-04-20 10:52

如果能转成 Arc<Mutex> 就更完美了

作者 kcrazy 2021-04-01 14:22

非常感谢!

93996817 2021-04-01 13:23
    let x: Arc<Mutex<dyn Any>> = Arc::new(Mutex::new(A {
        hello: "Hello World!".to_string(),
    }));
    let xx=x.lock().unwrap();
    if let Some(ref a) = xx.downcast_ref::<A>() {
        a.abc();
        a.test();
    }
93996817 2021-04-01 12:57
这是一种方法 不过要增加方法

use std::{any::Any, sync::{Arc, Mutex}};

/* ITrait 接口 */
pub trait ITrait: Sync + Send {
    fn abc(&self);

    fn as_any(&self) -> &dyn Any;

}

/* 具体对象 A */
pub struct A {
    hello: String,
}

impl ITrait for A {
    fn abc(&self) {
        println!("abc!");
    }
   
    fn as_any(&self) -> &dyn std::any::Any {
        self
      }
}

/* A 的特有方法 */
impl A {
    pub fn test(&self) {
        println!("{}", self.hello);
    }
}

fn main() {
    let x: Arc<Mutex<dyn ITrait>> = Arc::new(Mutex::new(A {
        hello: "Hello World!".to_string(),
    }));

     let x=x.lock().unwrap();
     x.abc();
     let x:&A=x.as_any().downcast_ref::<A>().expect("convert ITrait to A failed");
    x.test();
 
}

1 共 4 条评论, 1 页