Rust 不推荐使用的别名不会生成警告
我有一个库,它曾经为Rust 不推荐使用的别名不会生成警告,rust,Rust,我有一个库,它曾经为选项实现了一个顶级公共特性(称之为FlatMap)。现在,我已经重构了我的库,并将该特性移动到名为option的子模块中,并且通过公开将FlatMap导入机箱的顶层,确保了向后兼容性。我想提醒顶级特性的用户,它已被弃用。我尝试了以下方法: pub mod option { pub trait FlatMap<T> {} } #[deprecated(note="Use option::FlatMap instead")] pub use option::Fl
选项
实现了一个顶级公共特性(称之为FlatMap
)。现在,我已经重构了我的库,并将该特性移动到名为option
的子模块中,并且通过公开将FlatMap
导入机箱的顶层,确保了向后兼容性。我想提醒顶级特性的用户,它已被弃用。我尝试了以下方法:
pub mod option {
pub trait FlatMap<T> {}
}
#[deprecated(note="Use option::FlatMap instead")]
pub use option::FlatMap;
因为我依赖于从
Option
到Option::FlatMap
的隐式转换来向Option
实例添加方法,而隐式转换不适用于别名特征。能够在Option
上调用Option::FlatMap
方法不是转换,隐式或其他——这只是方法的解析方式。如果某个对象的Trait已被use
d解析,那么Trait方法可以在该对象上解析,但是顶级FlatMap
Trait没有方法,因此它根本不会向该对象添加任何内容
现在看来,在Rust中实现这一点的最佳方法是将trait(及其所有内容)复制到顶层,对其进行注释,然后编写一个符合“真实”版本的总括impl
pub mod选项{
公共特征平面图{
类型项目;
类型平面图;
fn平面映射(self,f:f)->self::平面映射
哪里
F:FnOnce(Self::Item)->T;
}
// ...
}
#[已弃用(注意=“改用option::FlatMap”)]
公共特征平面图{
类型项目;
类型平面图;
fn平面映射(self,f:f)->self::平面映射
哪里
F:FnOnce(Self::Item)->T;
}
#[允许(不推荐)]
用于U
哪里
选项::平面地图,
{
类型Item=U::Item;
类型FlatMap=U::FlatMap;
fn平面映射(self,f:f)->self::平面映射
哪里
F:FnOnce(Self::Item)->T,
{
选项::平面贴图::平面贴图(self,f)
}
}
任何使用“外部”平面地图的尝试都将生成弃用警告()
这种方法的一个限制(除了冗长之外)是这两个特征作为特征对象不兼容(例如,您不能将&FlatMap
传递给期望&option::FlatMap
的函数),但是,这一特征无论如何都不是对象安全的,因此在这种情况下这并不重要
碰巧的是,您对
平面图的定义--
,而对和_then
的泛化是一种不同于使用的泛化,包括。因此,您可能需要考虑重命名它。(我认为,map\u或_default
可以很好地与上可用的其他方法配合使用。)为什么不使用impl FlatMap for t{}
作为别名特征?@Stefan,因为我没有想到它。但是,它也不起作用:隐式转换仍然不适用于别名特征。在什么情况下必须将选项
隐式转换为选项::平面映射
?您是否可以impl Deref for FlatMap{type Target=option::FlatMap;…}
使其再次工作?@trentclFlatMap
trait为选项对象添加了一个FlatMap
方法,然后我将其称为o.FlatMap(…)
。我需要它,因为它实际上是由一个宏调用的,该宏必须透明地使用迭代器和选项(和结果,以及定义映射和平面映射方法的任何用户定义类型)。我的板条箱的完整代码已打开。正如我所说,我需要将其命名为flat\u map
,以便进行鸭子打字。实际上,它一开始是直接等价于和_,然后是,当前的泛化是从试图透明地混合选项和迭代器发展而来的(我需要一种通用的方法来创建任何迭代器的空实例,我希望不用看迭代器以这种方式实现的文档Default
)。
pub mod option {
pub trait FlatMap<T> {}
}
#[deprecated(note="Use option::FlatMap instead")]
pub trait FlatMap<T>: option::FlatMap<T> {}
impl<T> FlatMap<T> for Option<T> {}
pub mod option {
pub trait FlatMap<T> {
type Item;
type FlatMap;
fn flat_map<F>(self, f: F) -> Self::FlatMap
where
F: FnOnce(Self::Item) -> T;
}
// ...
}
#[deprecated(note = "Use option::FlatMap instead")]
pub trait FlatMap<T> {
type Item;
type FlatMap;
fn flat_map<F>(self, f: F) -> Self::FlatMap
where
F: FnOnce(Self::Item) -> T;
}
#[allow(deprecated)]
impl<T, U> FlatMap<T> for U
where
U: option::FlatMap<T>,
{
type Item = U::Item;
type FlatMap = U::FlatMap;
fn flat_map<F>(self, f: F) -> Self::FlatMap
where
F: FnOnce(Self::Item) -> T,
{
option::FlatMap::flat_map(self, f)
}
}