Rust中为何无法克隆指向trait对象的Rc指针并完成传参?
问题核心原因
你遇到的报错本质是类型不匹配,不是Rust不支持克隆指向trait对象的Rc指针:
- 你代码里声明的
s变量,Rust自动推断的类型是Rc<SomeThing>,而非Rc<dyn SomeTrait> - 涉及泛型函数(比如
Rc::clone)的调用时,Rust不会自动执行「将具体类型转为trait对象(DST unsizing coercion)」的隐式转换,所以返回的克隆值类型还是Rc<SomeThing>,和some_function要求的Rc<dyn SomeTrait>不兼容 - 你直接传
s第一次可以运行,是因为这个场景下Rust会做隐式类型转换,但传值会转移s的所有权,后续自然无法再次使用 - 传引用给
another_function报错的原因和克隆的报错一致:&Rc<SomeThing>和&Rc<dyn SomeTrait>是两种不同的类型
最简解决方式
在声明s的时候手动标注类型为Rc<dyn SomeTrait>,所有调用就都可以正常运行:
use std::rc::Rc; trait SomeTrait {} struct SomeThing {} impl SomeTrait for SomeThing {} fn some_function(s: Rc<dyn SomeTrait>) {} fn another_function(s: &Rc<dyn SomeTrait>) {} fn main() { // 手动标注类型为trait对象的Rc let s: Rc<dyn SomeTrait> = Rc::new(SomeThing{}); // 克隆后传参正常运行 some_function(Rc::clone(&s)); // 多次调用都正常 some_function(Rc::clone(&s)); some_function(Rc::clone(&s)); // 传引用也正常运行 another_function(&s); }
如果你不想修改s的声明,也可以在传参时手动做类型转换:
some_function(Rc::clone(&s) as Rc<dyn SomeTrait>); another_function(&(s as Rc<dyn SomeTrait>));
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

