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

Rust常量项签名类型中使用占位符`_`触发E0121错误的问题求助

Rust常量项签名类型中使用占位符_触发E0121错误的问题求助

各位Rust圈的朋友好!最近我写代码的时候碰到了个棘手的E0121错误,折腾半天没搞明白,想请大伙帮忙支支招。

先贴一下我当前的代码结构:

pub struct NoDynamicFilter;

pub struct S3Filter<F> {
    pub prefix: Option<&'static str>,
    pub(crate) dynamic: Either<F, NoDynamicFilter>,
}

pub fn new_filter<F>(prefix: Option<&'static str>, dynamic: F) -> S3Filter<F>
where
    F: DynamicFilter,
{
    S3Filter {
        prefix,
        dynamic: Either::Left(dynamic),
    }
}

pub trait DynamicFilter {
    fn matches(&self, key: &str) -> bool;
}

我本来想定义一个默认的常量过滤器,代码大概是这样:

pub const DEFAULT_FILTER: S3Filter<_> = S3Filter {
    prefix: None,
    dynamic: Either::Right(NoDynamicFilter),
};

结果编译器直接给我报了E0121,说“不能在常量项的类型签名里使用占位符_”。我之前在变量定义里经常用_让编译器自动推断类型,怎么到常量这里就不行了呢?

我自己也试着捣鼓了几种思路,但都觉得不够优雅:

  • 直接把类型写死成S3Filter<NoDynamicFilter>,虽然能编译过,但感觉有点冗余,毕竟dynamic字段已经明确是Right(NoDynamicFilter)了,按说编译器应该能自动推断出来才对
  • 想过用函数返回常量,比如写个fn default_filter() -> S3Filter<NoDynamicFilter>,但这样每次获取默认过滤器都要调用函数,不如直接用常量来得直接

想请教下大伙:

  1. 为什么Rust要限制常量的类型签名不能用_做推断?
  2. 有没有什么更优雅的写法,既能让编译器自动推断类型,又能保持常量的定义方式?
  3. 是不是我的代码结构设计有问题,才导致遇到这个限制?

麻烦各位大佬不吝赐教,谢谢啦!

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 13:39:39