Rust 返回位置中具有泛型关联类型的Impl trait导致生存期错误
我需要将Rust 返回位置中具有泛型关联类型的Impl trait导致生存期错误,rust,Rust,我需要将fn(I)->O(其中I和O可以是引用)存储在的静态结构中O需要是一个trait,具有一个静态的泛型关联类型,该关联类型也存储在结构中。无论是I还是O本身都不会存储在结构内部,因此它们的生存期应该无关紧要。但是编译器仍然在抱怨I活得不够长 IntoState{ 类型状态:'静态; fn进入_状态(self)->self::状态; } 为&str执行IntoState命令(&str){ 类型状态=字符串; fn进入_状态(self)->self::状态{ self.to_string()
fn(I)->O
(其中I
和O
可以是引用)存储在的静态结构中O
需要是一个trait,具有一个静态的
泛型关联类型,该关联类型也存储在结构中。无论是I
还是O
本身都不会存储在结构内部,因此它们的生存期应该无关紧要。但是编译器仍然在抱怨I
活得不够长
IntoState{
类型状态:'静态;
fn进入_状态(self)->self::状态;
}
为&str执行IntoState命令(&str){
类型状态=字符串;
fn进入_状态(self)->self::状态{
self.to_string()
}
}
结构容器{
func:F,
国家:S,
}
impl容器O,O::State>
哪里
O:世界审计组织,
{
fn新建(输入:I,函数:fn(I)->O)->Self{
//I&O只存在于下一行代码中。O被转换为
//存储在“容器”中的“静态”(“字符串”)。
让state=func(输入).into_state();
容器{func,state}
}
}
fn映射(i:&str)->impl'uu+IntoState{
我
}
fn main(){
设={
//创建一个临时值
设s=“foo”。to_string();
//临时工实际上只需要生活在“新”的环境中
//从不存储在“容器”中。
容器::新建(s.as_str(),映射)
//错误:^借用的值的有效期不够长
};
//呃:`s`是在借的时候掉在这里的
}
据我所知,编译器的错误消息具有误导性,它实际需要的是一个明确定义的关联类型:
fn映射(i:&str)->impl'\uu+IntoState{
我
}
对这个问题给出的最佳答案是:提供了足够的信息,说明为什么需要这样做
另见
您可以使用泛型类型参数,而不是返回impl
,在这种情况下,您不必指定关联的类型:
fn映射(i:T)->T{
我
}
据我所知,编译器的错误消息具有误导性,它实际需要的是明确定义的关联类型:
fn映射(i:&str)->impl'\uu+IntoState{
我
}
对这个问题给出的最佳答案是:提供了足够的信息,说明为什么需要这样做
另见
您可以使用泛型类型参数,而不是返回impl
,在这种情况下,您不必指定关联的类型:
fn映射(i:T)->T{
我
}
显然,这里到底发生了什么还有些混乱,所以我将尝试将我的评论归纳成一个简短的答案
这里的问题是函数map()
的原型:
这指定map()
的返回类型是实现IntoState
的某种类型,具有未指定的关联类型State
。返回类型有一个生存期参数,参数的生存期为i
;让我们调用生存期'a
,完整返回类型T为IntoState>::State
,由'a
参数化。尽管trait定义中有“static
声明,编译器当前无法从关联类型中消除此生存期参数。通过将关联的类型显式指定为String
,编译器将只使用显式指定的类型String
,而不是,显然这里到底发生了什么仍然有些混乱,因此我将尝试将我的注释转换为简短的答案
这里的问题是函数map()
的原型:
这指定map()
的返回类型是实现IntoState
的某种类型,具有未指定的关联类型State
。返回类型有一个生存期参数,参数的生存期为i
;让我们调用生存期'a
,完整返回类型T为IntoState>::State
,由'a
参数化。尽管trait定义中有“static
声明,编译器当前无法从关联类型中消除此生存期参数。通过将关联类型显式指定为String
,编译器将只使用显式指定的类型String
,而不是。问题似乎在于关联的泛型类型,如果我将其删除(将String
插入为返回类型),它将开始工作。但我希望它对于我的应用程序逻辑是通用的。我是否应该更新标题和描述以更好地反映问题(这里的问题不是存储fn,而是IntoState
trait/“missing”泛型类型)?我会以一种与静态生存期无关的方式更新它,但它仍然反映编译器的错误消息(因为人们会搜索那些误导性的东西)问题似乎在于关联的泛型类型,如果我删除它(插入String
作为返回类型),它开始工作..但我认为它对于我的应用程序逻辑是泛型的。我是否应该更新标题和描述以更好地反映问题(这里的问题是不存储fn,而是IntoState
trait/“missing”泛型类型)?我会以一种与静态生存期无关的方式对其进行更新,但它仍然反映编译器的错误消息(因为人们会搜索误导性的内容)更新中的版本在本例中起作用,但有时您实际上希望使用存在类型。您可以使用类似于impl IntoState的hack。我相信我找到了解决此问题的正确GitHub问题:@SvenMarnach这不是一个bug。返回T:IntoState
(普遍量化)与返回impl IntoS完全不同
fn map(i: &str) -> impl '_ + IntoState