rust - Trait 方法返回具有不同类型和/或生命周期参数的“Self”类型
问题描述
Rust 编译器不允许Self
在 trait 方法的返回类型中指定新的类型参数。也就是说,特征方法可以返回Self
,但不能Self<T>
。我对完成以下任务的正确方法很感兴趣;或者如果从根本上不可能,那为什么会这样。
假设我们有两个结构如下:
pub struct SomeStruct<T> {
id: usize,
description: String,
extra_data: T,
}
pub struct OtherStruct<T> {
permit_needed: bool,
registration_number: usize,
extra_data: T,
}
这两个结构都有一个extra_data
type 字段T
,其中T
是泛型类型参数。我们可以在两个结构上实现诸如get_extra_data()
,更有趣的是, 之类的方法:transform()
impl<T> SomeStruct<T> {
pub fn get_extra_data(&self) -> &T {
&self.extra_data
}
pub fn transform<S>(&self, data: S) -> SomeStruct<S> {
SomeStruct {
id: self.id,
description: self.description.clone(),
extra_data: data,
}
}
}
impl<T> OtherStruct<T> {
pub fn get_extra_data(&self) -> &T {
&self.extra_data
}
pub fn transform<S>(&self, data: S) -> OtherStruct<S> {
OtherStruct {
permit_needed: self.permit_needed,
registration_number: self.registration_number,
extra_data: data,
}
}
}
但是我在创建一个Transformable
关于这些操作统一这两种类型的特征时遇到了麻烦:
trait Transformable<T> {
fn get_extra_data(&self) -> &T;
fn transform<S>(&self, data: S) -> Self<S>;
}
该transform()
函数需要返回与 相同类型的东西Self
,只是使用不同的类型参数。不幸的是,rust 编译器通过错误消息拒绝了这一点E0109: type arguments are not allowed for this type
。
即使是较弱的签名fn transform<S>(&self, data: S) -> impl Transformable<S>
也会被拒绝,并带有错误E0562: impl Trait not allowed outside of function and inherent method return types
。据我所知,这里的传统解决方案是返回关联类型而不是impl
,但在这种情况下需要通用关联类型。无论如何,这似乎比Self<S>
我们真正想要的更强的签名更加迂回。
类似的问题发生在生命周期参数上的方式完全相同。我实际上对生命周期参数的情况更感兴趣,但我认为类型参数的情况可能更容易理解和谈论,并且清楚地表明问题不是特定于生命周期的。
解决方案
推荐阅读
- reactjs - 没有为 antd 菜单选项加载 CSS
- ruby-on-rails - Ruby 将参数传递给构造函数,使其行为类似于动态方法
- reporting-services - 如何设置不同的 SSRS 图表图例文本颜色
- javascript - 使用 FileReader 的 onload 函数的返回值
- sql - 如何在一列下获得一个月中的天数,并在不同列中显示不同的月份
- java - 在 Windows 上运行 JavaFX 应用程序时出错
- python - 如何在 Pytransitions 中向现有状态对象添加标签?
- account-kit - Facebook 帐户工具包已弃用
- r - 使用 for 循环时如何在 R 中编写 tryCatch() 函数?
- php - 加入表格时总和不正确