![](/img/trans.png)
[英]Ensure arguments to generic method have same type in trait method
[英]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.