我正在尝试学习有关具有类型参数和特征的结构化软件的更多信息。我可以使我的程序正常工作,我只是想改善去耦。
[当我依赖具有类型参数的类型时,例如A<T>
,其中类型参数具有约束,这意味着我也必须依赖约束。例如,
fn x<T: C>(arg: A<T>)
没有指定C
,编译器会抱怨绑定A: C
的特征不是满意。对我而言,这没有任何意义。我不需要C
方法。A
可能会针对C
进行更改,但这不会影响我。
如何避免不得不依赖C
?
这里是我用来探讨可能解决方案的larger playground example中的相关部分。完全是人为的,我的真实代码具有四个具有不同约束的类型参数。
mod auth {
pub trait Authz {
fn allowed(&self) -> bool;
}
}
mod limiter {
use super::auth;
pub struct Limiter<T: auth::Authz> {
pub m: T,
pub data: i32,
}
impl<T: auth::Authz> Limiter<T> {
pub fn limit(&self) {
if ! self.m.allowed() { panic!("not allowed"); }
}
}
}
// Works but is depedendent on Authz for every method. How do I avoid naming Authz within service?!
mod service {
use super::limiter;
pub struct Service;
impl Service {
pub fn invoke<T: super::auth::Authz>(a: limiter::Limiter<T>) {
a.limit()
}
}
}
rustc --explain E0207
很棒。PhantomData
,但这只是将问题转移到其他地方。您并不是唯一一个认为应该可以忽略此处暗示的特征的人。一旦实现,an accepted RFC about implied trait bounds将允许您忽略示例中的特征范围。
隐式特征边界已经在the experimental constraint solver "chalk"中实现,打算最终集成到Rust编译器中。根据tracking issue for the mentioned RFC,我们将不得不等待这种情况发生,才能看到对Rust中隐式特征范围的支持。