Rust中如何为依赖可选Trait Bound的泛型参数设默认类型?
可行,具体实现如下
你可以通过为泛型参数T设置默认类型,并结合ToOwned trait的约束,让编译器自动推断T的类型,完全满足你的需求。
修改后的枚举定义
use std::borrow::{Borrow, ToOwned}; enum RefOrOwned<'a, B: ?Sized, T = <B as ToOwned>::Owned> where B: ToOwned, T: Borrow<B>, { Ref(&'a B), Owned(T), }
关键改动说明
- 给
T指定了默认类型<B as ToOwned>::Owned,也就是B通过ToOwnedtrait定义的自有类型 - 在where约束中新增
B: ToOwned,保证默认类型的有效性 - 保留原有的
T: Borrow<B>约束,确保Owned(T)变体可以借用为B类型
使用示例
现在无需显式指定T,编译器会自动完成推断:
fn main() { // 自动推断T为String let borrowed = RefOrOwned::<str>::Ref("Hi :D"); // 自动推断T为String let owned = RefOrOwned::Owned(String::from("Hi :D")); }
如果需要使用自定义的T类型(不使用B::Owned),仍然可以显式指定泛型参数:
// 自定义实现Borrow<str>的类型 struct MyStr(String); impl Borrow<str> for MyStr { fn borrow(&self) -> &str { &self.0 } } fn main() { // 显式指定T为MyStr let custom = RefOrOwned::<str, MyStr>::Owned(MyStr(String::from("Hi"))); }
内容的提问来源于stack exchange,提问作者Debaug
相关产品推荐
相关产品推荐

