generics - rust:巨大的通用构造函数,嵌套特征

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

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

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

谢谢!

最佳答案

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

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

关于generics - rust:巨大的通用构造函数,嵌套特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23714751/

相关文章:

recursion - Rust-在递归函数中收集Vec的切片

java - 为什么泛型类型参数在 Java 中不能有下限?

Java 泛型 : Is any meta information about the generic type preserved at runtime as well?

java - 如何获取泛型类的 "real"类型?

c# - 实现通用接口(interface)时奇怪的 C# 行为

rust - 进行多次可变和不可变借贷的最佳实践是什么? [复制]

functional-programming - 如何创建 `FnOnce` 函数

rust - 如何给 impl 特征起别名?

generics - 使用泛型类型时如何使用整数文字?

string - 为什么 &str 原语存在?