Rust中如何指定受约束泛型类型为引用?(specs库场景)
解决Specs中Join泛型引用的Trait约束问题
直接修改泛型参数的约束,让I的不可变引用满足Join trait即可,同时修正关联类型的匹配要求:
fn calculate_unequip<I>( entities: &Read<EntitiesRes>, items: &I, equipped: &mut WriteStorage<Equipped>, owner: Entity, item_entity: Entity, slot: EquipSlot, ) -> Vec<(Entity, Equipped, Item)> where for<'a> &'a I: Join, <&'a I as Join>::Type: IsItem, { (entities, equipped, items) .join() // 补充你的过滤/处理逻辑,比如筛选对应owner、slot的条目 .collect() }
为什么这么改:
- 原代码约束
I: Join,但你实际传入的是&I,Rust不会自动为&I继承I的所有trait实现,因此必须显式声明任意生命周期的&I都实现Join,即for<'a> &'a I: Join。 - 由于现在是
&I实现Jointrait,对应的关联类型Type要从<&I as Join>::Type获取,所以where子句需要约束该类型满足IsItem。
如果你的IsItem trait定义了指向Item的关联类型,只需确保<&I as Join>::Type实现该trait即可,无需额外调整。
内容的提问来源于stack exchange,提问作者bbarker
相关产品推荐
相关产品推荐

