Rust源/目标引用可相同时BMut转B的E0277编译错误解决问询
问题根因
你当前的编译报错核心是类型不匹配:
- 你已实现的
From是消费BMut值本身,将其转换为B值 - 但代码中调用
.into()的是&mut BMut<Self>可变引用,需要返回的也是&B<Self>不可变引用,没有对应的转换实现。
解决方案1:实现引用层面的转换
新增一个针对引用的From实现,直接从&BMut得到&B,符合你不消费destination的需求:
// 新增以下impl impl<'a, T> From<&'a BMut<'a, T>> for &'a B<'a, T> { fn from(_: &'a BMut<'a, T>) -> Self { // B是仅包含PhantomData的零大小类型,可安全构造并返回引用 &B { _phantom: PhantomData } } }
然后修改transform方法中的match分支,先把可变引用转成不可变引用再调用转换:
let source = match source{ Some(source) => source, None => (&*destination).into() };
解决方案2:直接构造B实例(更简洁)
因为你的B类型没有实际存储数据,只是作为索引的标记类型,不需要和BMut有实际关联,所以可以在无source时直接构造B的临时实例取引用,不需要额外加转换实现:
let source = match source{ Some(source) => source, None => &B { _phantom: PhantomData } };
补充说明
如果你后续B和BMut要添加实际的关联数据,只需要修改上面的引用转换实现,把实际的共享指针/引用传递过去即可,上层的transform逻辑不需要改动。
内容的提问来源于stack exchange,提问作者Margareth Reena
相关产品推荐
相关产品推荐

