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>,但这样每次获取默认过滤器都要调用函数,不如直接用常量来得直接
想请教下大伙:
- 为什么Rust要限制常量的类型签名不能用
_做推断? - 有没有什么更优雅的写法,既能让编译器自动推断类型,又能保持常量的定义方式?
- 是不是我的代码结构设计有问题,才导致遇到这个限制?
麻烦各位大佬不吝赐教,谢谢啦!
内容来源于stack exchange
相关产品推荐
相关产品推荐

