rust return impl Trait
impl Trait:静态分发
dyn Trait:动态分发
静态分发:在编译期就确定了具体返回类型,函数只能返回一种类型。
动态分发:在运行时才能确定具体返回类型,函数可以返回多种类型。
Trait Object:指向trait的指针,假设Animal是一个triait,那么&Animal和Box<Animal>都是一种Trait Object。
胖指针:用于指代动态大小类型(DST)的引用和原始指针(切片或特征对象)。胖指针包含一个指针以及一些使DST完成(例如长度)的信息。
返回值为impl Trait时用dyn Trait是没问题的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | trait Animal { fn get_kind(& self ) - > String; fn default_impl(& self ) { println!( "default impl" ); } } impl dyn Animal { fn trait_object() { println!( "trait object" ); } } #[derive(Debug)] struct Dog {} impl Animal for Dog { fn get_kind(& self ) - > String { "Dog" .to_string() } } struct Cat {} impl Animal for Cat { fn get_kind(& self ) - > String { "Cat" .to_string() } } / / 静态分发 fn get_animal_static() - > impl Animal { let x = 1 ; if x = = 1 { Dog {} } else { Dog {} } } / / 动态分发 fn get_animal_dyn() - > Box<dyn Animal> { let x = 0 ; if x = = 1 { Box::new(Dog {}) } else { Box::new(Cat {}) } } fn main() { let dog = Dog {}; dog.default_impl(); let cat = Cat {}; cat.default_impl(); / / 只有 trait objects 才能调用 / / dog.trait_object(); / / cat.trait_object(); <dyn Animal>::trait_object(); let _ = &<dyn Animal>::trait_object(); let animal = get_animal_static(); / / Dog println!( "{}" , animal.get_kind()); let animal = get_animal_dyn(); / / Cat println!( "{}" , animal.get_kind()); } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· Apache Tomcat RCE漏洞复现(CVE-2025-24813)