簡體   English   中英

如何讓一個特征方法有一個結構參數,其中一個項目必須實現相同的特征?

[英]How to have a trait method have a struct argument, in which an item must implement that same trait?

我有一個結構Lambertian

pub struct Lambertian {
    albedo: Color,
}

具有相關方法的Material特性:

pub trait Material {
    fn scatter(&self, ray: &Ray, rec: &HitRecord) -> Option<(Ray, Color)>;
}

最后,另一個結構體包含實現了Material特性的東西的值

pub struct HitRecord<T>
where T: Material
{
    // snip
    pub mat_ptr: Rc<T>,
}

因此,我希望HitRecord中的泛型T實現Material ,但我在特征方法scatter中有一個類型為HitRecord的參數。 為了完成這項工作,我必須用另一個T注釋Material ,然后指定 T 也實現 Material ...因此進行遞歸定義。 我需要做什么呢?

您可以將泛型放在scatter方法上而不是Material

pub trait Material {
    fn scatter<T>(&self, ray: &Ray, rec: &HitRecord<T>) -> Option<(Ray, Color)>
    where
        T: Material;
}

或者,如果您希望rec使用與self相同的材料類型,請使用通用參數Self

pub trait Material {
    fn scatter(&self, ray: &Ray, rec: &HitRecord<Self>) -> Option<(Ray, Color)>;
}

這需要放寬HitRecord<T>上的Sized約束:

pub struct HitRecord<T>
where
    T: Material + ?Sized,

暫無
暫無

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

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