rust怎么实现 trait object向其实现类型的转换?

kkkkkkkkkkkkikkkkk 2016-10-12 11:44:12
就像大多数面向对象语言的父类转子类, 接口转实现一样

interface Greet {
public void say();
}

class Student implements Greet {
public String name;
public void say() {
System.out.println("student");
}
}

class Teacher implements Greet {
public String classz;
public void say() {
System.out.println("teacher");
}
}

List<Greet> dp = new ArrayList();
dp.add(new Student());
dp.add(new Teacher());

Teacher d = (Teacher)dp.get(1);


接口类型可以强转为实现类。

在rust里怎么实现这种功能?
请教请教
...全文
700 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
skyf**er 2020-01-29
  • 打赏
  • 举报
回复


let tests = vec![
Tests::new("x"),
Tests::new("y"),
Tests::new("foobar"),
];


for (i,v) in tests.iter().enumerate() {
let tmp:& Box<dyn ast::Node> = &program.statements[i];

let b: &ast::LetStatement = match tmp.as_any().downcast_ref::<ast::LetStatement>() {//类似接口断言...
Some(b) =>b,
None =>panic!("&Node is not a let statement"),
};

test_let_statment_helper(b,&v.expectedIdentifier);
}

//结构体定义
use std::any::Any;
pub trait Node: std::fmt::Debug {
fn token_literal(&self) -> String;
fn as_any(&self) -> &dyn Any;
}

impl Node for Program {
fn token_literal(&self) ->String {
if self.statements.len()>0 {
return self.statements[0].token_literal();
}
"".to_string()
}
fn as_any(&self)->&dyn Any{
self
}
}
kkkkkkkkkkkkikkkkk 2016-10-18
  • 打赏
  • 举报
回复
没人没人回啊

3,882

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧