Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.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 返回位置中具有泛型关联类型的Impl trait导致生存期错误_Rust - Fatal编程技术网

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