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;…}
使其再次工作?@trentcl
FlatMap
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)
    }
}