簡體   English   中英

銹:龐大的泛型構造函數,嵌套特征

[英]rust: huge generic constructors, nested trait

為了保持我一直在研究的通用庫,我發現自己編寫了這段巨大的代碼來構造一個結構:

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

盡管這行得通,但工作起來很痛苦並且非常重復。 每個輸入都有一個與之關聯的特征,並且其中一些特征也被模板化(Sampler)。

有人有更干凈的表達方式嗎? 我看問題全錯了嗎?

謝謝!

您可以通過省略new()定義中的類型參數來簡化代碼,即,您無需編寫new<Camera_T : Camera, Sampler_T : Sampler<Sample_Iter>, SurfaceIntegrator_T : SurfaceIntegrator, Filter, Sample_Iter>()可以只寫new() 相應的參數將從impl<...>子句中獲取。

除此之外,我認為您還不走運。 類型參數語法要求您鍵入所有這些名稱。 實際上,您也將使用其他語言執行類似的操作。 您可以嘗試使用更簡單的單字母名稱作為類型參數。 給定它們的編號,可能會不太可讀,但是至少您可以嘗試一下。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM