生锈:巨大的通用构造函数,嵌套特征

时间:2014-05-17 18:30:23

标签: generics traits rust nested-generics

为了保持一个我一直在研究相当通用的库,我发现我自己编写这个巨大的代码来构造一个结构:

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
    }
  }
}

虽然这有效,但使用起来很麻烦并且非常重复。每个输入都有一个与之相关的特征,其中一些特征也是模板化的(采样器)。

有人有更清洁的表达方式吗?我在看问题都错了吗?

谢谢!

1 个答案:

答案 0 :(得分:4)

您可以通过省略new()定义中的类型参数来简化代码,也就是说,您不需要编写new<Camera_T : Camera, Sampler_T : Sampler<Sample_Iter>, SurfaceIntegrator_T : SurfaceIntegrator, Filter, Sample_Iter>(),只需编写new()即可。相应的参数将取自impl<...>子句。

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