如何避免传递类型依赖?

问题描述 投票:0回答:1

我正在尝试学习有关具有类型参数和特征的结构化软件的更多信息。我可以使我的程序正常工作,我只是想改善去耦。

[当我依赖具有类型参数的类型时,例如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()
        }
    }
}

playground

为了理解我做了什么

  • 我读过rustc --explain E0207很棒。
  • 我尝试使用PhantomData,但这只是将问题转移到其他地方。
  • 我尝试为Limiter使用特征,以便Service可以单独依赖它。很好,除非我无法访问具体结构的字段,除非我进行吸气剂并将其添加到特征中。但是我感觉这就是答案。
generics rust architecture decoupling
1个回答
0
投票

您并不是唯一一个认为应该可以忽略此处暗示的特征的人。一旦实现,an accepted RFC about implied trait bounds将允许您忽略示例中的特征范围。

隐式特征边界已经在the experimental constraint solver "chalk"中实现,打算最终集成到Rust编译器中。根据tracking issue for the mentioned RFC,我们将不得不等待这种情况发生,才能看到对Rust中隐式特征范围的支持。

© www.soinside.com 2019 - 2024. All rights reserved.