You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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通过ToOwned trait定义的自有类型
  • 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 07:20:30