Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust Trait方法,返回具有不同类型和/或生存期参数的'Self'-type_Rust - Fatal编程技术网

Rust Trait方法,返回具有不同类型和/或生存期参数的'Self'-type

Rust Trait方法,返回具有不同类型和/或生存期参数的'Self'-type,rust,Rust,Rust编译器不允许在trait方法的返回类型中的Self上指定新的类型参数。也就是说,trait方法可以返回Self,但不能返回Self。我对实现以下目标的正确方法感兴趣;或者如果根本不可能,那么为什么会这样 假设我们有两个结构,如下所示: pub struct SomeStruct{ id:使用, 描述:字符串, 额外数据:T, } 发布结构其他结构{ 需要许可证:bool, 注册号:usize, 额外数据:T, } 这两个结构都有一个类型为T的extra_data字段,其中T是泛型类型参

Rust编译器不允许在trait方法的返回类型中的
Self
上指定新的类型参数。也就是说,trait方法可以返回
Self
,但不能返回
Self
。我对实现以下目标的正确方法感兴趣;或者如果根本不可能,那么为什么会这样

假设我们有两个结构,如下所示:

pub struct SomeStruct{
id:使用,
描述:字符串,
额外数据:T,
}
发布结构其他结构{
需要许可证:bool,
注册号:usize,
额外数据:T,
}
这两个结构都有一个类型为
T
extra_data
字段,其中
T
是泛型类型参数。我们可以在两种结构上实现方法,例如
get\u extra\u data()
,更有趣的是,
transform()

impl SomeStruct{
发布fn获取额外数据(&self)->&T{
&self.extra_数据
}
pub-fn转换(&self,数据:S)->SomeStruct{
SomeStruct{
id:self.id,
description:self.description.clone(),
额外数据:数据,
}
}
}
impl-OtherStruct{
发布fn获取额外数据(&self)->&T{
&self.extra_数据
}
pub-fn转换(&self,数据:S)->OtherStruct{
其他结构{
需要许可证:需要自我许可证,
注册号:self.registration\u number,
额外数据:数据,
}
}
}
但是我很难创建一个trait
可转换的
,它将这两种类型与这些操作结合起来:


性状转化{
fn获取额外数据(&self)->&T;
fn转换(&self,数据:S)->self;
}
transform()
函数需要返回与
Self
类型相同的内容,只是返回一个不同的类型参数。不幸的是,rust编译器拒绝了此操作,并显示错误消息
E0109:此类型不允许使用类型参数

甚至较弱的签名
fn transform(&self,data:S)->impl Transformable
也被拒绝,错误
E0562:impl Trait不允许出现在函数和固有方法返回类型之外。据我所知,这里的传统解决方案是返回关联类型,而不是
impl
,但在这种情况下需要泛型关联类型。不管怎么说,这似乎比我们真正想要的更强的自我签名更迂回


对于寿命参数,类似问题的发生方式完全相同。实际上,我对lifetime parameters案例更感兴趣,但我认为type parameters案例可能更容易理解和讨论,并且也清楚地表明问题不是特定于lifetime的。

struct不知道结构所需的泛型参数的数量。
fn transform(&self,data:S)->impl可转换将非常接近您想要的。但是
impl Trait
还不能用于特征定义。我也不确定它是否会被支持。使用
Self
impl Transformable
Box
等工具无法实现这一点。我写了一个很长的答案,我放弃了它,因为你已经知道了。关联类型有什么问题,比如?也许你可以详细说明用法,如何在整个项目中使用,还有其他方法可以实现你想要的?如果
Self
是一种非泛型的类型,
Self
到底意味着什么?感谢大家的评论,注意到这种特质不知道
Self
是否是通用的——这完全有道理@zrzka我正在尝试一些与你的游乐场解决方案相关的东西。谢谢你的建议。