rust - 如何为我不拥有的类型的固有方法创建特征?
问题描述
我想实现我自己版本的 Rust 标准库功能,并可以互换使用我的版本和真正的标准库版本。
如果标准库功能是一个特征,这将很容易。但是,标准库功能(在本例中std::sync::Condvar
为 )实现为
pub struct Condvar {...}
impl Condvar {...}
我试着做
impl Condvar for MyCondvar {...}
但出现错误(“错误[E0404]:预期特征,找到结构Condvar
”)
我该怎么做?我也试过
pub trait CondvarTrait { // copy entire interface of Condvar }
impl CondvarTrait for Condvar {
// copy entire interface of Condvar again,
// implementing foo(&self, ...) by calling self.foo(...)
}
impl CondvarTrait for MyCondvar { // my own implementation }
可以编译,但非常冗长。有没有更好的办法?
解决方案
您需要复制该类型的整个接口并通过调用固有方法重新实现它。
也可以看看:
有没有更好的办法?
与您描述要求的方式不同。
话虽如此,您并没有引入任何适合您的领域的抽象。在许多情况下,您不想要底层类型的全部功能,而是想要进行一些更高级别的抽象。如果您将该抽象创建为特征,那么您可以为任何有用的类型实现新特征。
推荐阅读
- arrays - 如何使用数据库数据填充 TableView(来自 NamedQuery 的对象)
- reactjs - RxJs debounce 在开玩笑测试期间立即发出事件
- azure-active-directory - 有没有办法在 B2C/B2B 场景中使用 Azure AD 提供完全自定义的登录屏幕
- hibernate - 在创建实体类时,为什么我们不能将 id 作为长类型?为什么我们需要把它当作长类型?
- spring-boot - JPA 外键未在 @OneToOne 中设置
- php - DB:选择 Laravel 5 如何将查询结果传递给我的帖子
- android - 我应该为数据库中的每个表创建一个继承 SQLiteOpenHelper 的类吗?
- python - 为什么表达式(假或假或假或真)等于假?
- java - 升级到 Gradle 5.2.1 不会生成 *-all.jar
- mongodb - Mongo - 重复文档的 ObjectId 是否不同?