【问题标题】:rust: huge generic constructors, nested traitrust:巨大的泛型构造函数,嵌套特征
【发布时间】:2014-05-17 18:30:23
【问题描述】:

为了保持我一直在开发的库的通用性,我发现自己编写了这么多的代码来构建一个结构:

pub struct SampleRenderer<Camera_T, Sampler_T, SurfaceIntegrator_T, Filter, Sample_Iter> {
  camera : Camera_T,
  sampler : Sampler_T,
  surface_integrator : SurfaceIntegrator_T,
  film : Film<Filter>,
}

impl<Camera_T, Sampler_T, SurfaceIntegrator_T, Filter, Sample_Iter> SampleRenderer
    <Camera_T, Sampler_T, SurfaceIntegrator_T, Filter, Sample_Iter> {
  pub fn new<Camera_T : Camera, Sampler_T : Sampler<Sample_Iter>, SurfaceIntegrator_T : SurfaceIntegrator, Filter, Sample_Iter>
    (camera : Camera_T, sampler : Sampler_T, surface_integrator : SurfaceIntegrator_T, film : Film<Filter>)
    -> SampleRenderer<Camera_T, Sampler_T, SurfaceIntegrator_T, Filter, Sample_Iter> {
    SampleRenderer {
      camera : camera,
      sampler : sampler,
      surface_integrator : surface_integrator,
      film : film
    }
  }
}

虽然这行得通,但使用起来很痛苦,而且非常重复。每个输入都有一个与之关联的特征,其中一些特征也是模板化的(采样器)。

有没有人有更简洁的方式来表达这一点?我是不是看错了问题?

谢谢!

【问题讨论】:

    标签: generics traits rust nested-generics


    【解决方案1】:

    你可以通过在new()定义中省略类型参数来简化你的代码,即你不需要写new&lt;Camera_T : Camera, Sampler_T : Sampler&lt;Sample_Iter&gt;, SurfaceIntegrator_T : SurfaceIntegrator, Filter, Sample_Iter&gt;(),你可以只写new()。对应的参数会取自impl&lt;...&gt;子句。

    除此之外,我认为,你不走运。类型参数语法要求您键入所有这些名称。事实上,你也会用其他语言做类似的事情。您可以尝试为类型参数使用更简单的单字母名称;鉴于它们的编号,它的可读性可能会降低,但至少您可以尝试一下。

    【讨论】:

    • +1 缩写 impl 中的类型参数名称(它们不必匹配名称结构声明),例如impl&lt;C, S, SurfInt, F, SampIter&gt; ....
    猜你喜欢
    • 1970-01-01
    • 2022-11-23
    • 1970-01-01
    • 1970-01-01
    • 2023-01-12
    • 2022-10-05
    • 1970-01-01
    • 2014-08-16
    相关资源
    最近更新 更多