Rust中能否为超特质绑定专属where子句?
如何为超特质添加特定的where子句?
我定义了自定义指针特质MyPtr,希望它能实现From特质,但From要求内部类型满足Sized约束。我不想给MyPtr添加全局的T:Sized限制,只希望当T:Sized时,From::from才可用。
以下代码无法编译:
trait MyPtr: Deref + From<Self::Target> {}
以下代码可以编译,但限制过于严格(强制所有MyPtr的实现者的Target都必须是Sized):
trait MyPtr: Deref + From<Self::Target> where <Self as Deref>::Target: Sized {}
我想要类似如下假想语法的效果:
trait MyPtr: Deref + { From<Self::Target> where <Self as Deref>::Target: Sized } {}
这种需求是否可以实现?
可以实现,Rust虽然不支持直接给单个超特质附加独立的where子句,但可以通过分离约束+条件性实现的方式达成需求:
- 先定义不带全局
Sized限制的MyPtr特质,仅继承Deref:
use std::ops::Deref; trait MyPtr: Deref {}
- 为所有满足
Target:Sized的MyPtr实现者,自动实现From<Self::Target>:
impl<P> From<<P as Deref>::Target> for P where P: MyPtr, <P as Deref>::Target: Sized, { fn from(value: <P as Deref>::Target) -> Self { // 这里需要根据你的`MyPtr`具体实现编写逻辑,示例: // 若MyPtr是Box的包装类型,可写为 MyPtr(Box::new(value)) unimplemented!() } }
这种方式的优势:
- 没有给
MyPtr本身添加全局Sized限制,允许Target为非Sized类型的类型实现MyPtr - 当某个
MyPtr实现者的Target满足Sized时,会自动获得From的实现,无需手动编写
如果需要在MyPtr特质中明确提示这种条件性实现关系,还可以添加一个默认方法(非必须):
trait MyPtr: Deref { // 仅当Target:Sized时可用的默认方法 fn from_target(value: Self::Target) -> Self where Self::Target: Sized, { From::from(value) } }
这样,当Self::Target是Sized时,调用者可以直接使用MyPtr::from_target,底层复用From的实现逻辑。
内容的提问来源于stack exchange,提问作者ajp
相关产品推荐
相关产品推荐

