Rust “平面地图”如何影响我的代码?

Rust “平面地图”如何影响我的代码?,rust,Rust,我一整天都在编写以下代码,(是playpen) ///将状态从一个移动到另一个的规则。 /// ///`S`-状态的类型参数。 /// ///`T`-输入符号的类型参数。 #[推导(PartialEq、Eq、Hash)] 发布结构规则{ 酒吧州:S, 酒吧符号:选项, 下一个州:S } 执行规则{ ///确定规则是否适用于给定的状态和符号 发布fn应用于(&self,state:&S,symbol:&Option)->bool{ self.state==*state&&self.symbol==

我一整天都在编写以下代码,(是playpen)

///将状态从一个移动到另一个的规则。
///
///`S`-状态的类型参数。
///
///`T`-输入符号的类型参数。
#[推导(PartialEq、Eq、Hash)]
发布结构规则{
酒吧州:S,
酒吧符号:选项,
下一个州:S
}
执行规则{
///确定规则是否适用于给定的状态和符号
发布fn应用于(&self,state:&S,symbol:&Option)->bool{
self.state==*state&&self.symbol===*symbol
}
}
///NFA中的过渡关系,
///包含NFA所需的所有规则。
发布结构NFATRANSIONS{
发布规则:HashSet
}
内隐式{
pub fn next_states(&self,states:&HashSet,symbol:&Option)->HashSet{
states.iter()平面图(| state |{
//这里有一个错误:借来的价值活得不够长
self.next_states_for(state,symbol).iter().map(| s | s.clone())
}).collect()
//但是,以下具有相同行为的代码可以编译
//让mut result=HashSet::new();
//用于状态中的状态。iter(){
//扩展(self.next_states_for(state,symbol).iter().map(| s | s.clone());
// }
//
//结果
}
///获取给定状态和符号的下一个状态
fn next_states_for(&self,state:&S,symbol:&Option)->HashSet{
self.rules.iter().filter|u映射(| rule|{
if rule.apply_to(state,symbol){Some(rule.next_state.clone())}else{None}
}).collect()
}
}
代码只是用于nfa转换规则的哈希集的包装器(我不关心这个)

flat_map
是我得到编译错误的地方。 这对我来说似乎很奇怪,因为我认为注释的行与
平面图
具有相同的行为,可以做得很好

我无法理解
错误:借来的值活得不够长
错误是如何产生的


有什么想法吗?

这里的问题是
iter()
,它与
next\u states\u for()

由于
next\u states\u for()
已经为您克隆了内容,
进入\u iter()
是您想要的,它会将项目移出集合

  pub fn next_states(&self, states: &HashSet<S>, symbol: &Option<T>) -> HashSet<S> {
    states.iter().flat_map(|state| {
      // error goes here: borrowed value does not live long enough
      self.next_states_for(state, symbol).into_iter()
    }).collect()
  }
pub fn next_states(&self,states:&HashSet,symbol:&Option)->HashSet{
states.iter()平面图(| state |{
//这里有一个错误:借来的价值活得不够长
self.next_states_for(state,symbol).into_iter()
}).collect()
}

闭包是通过引用捕获的,这就是为什么它与for循环不同。

我猜想闭包结果的生命周期太短,因为
next\u states\u for
的结果是临时的。你也能提供一个playpen链接和规则的源/实现吗?@delnan那么,你有什么线索吗?毕竟,这似乎是一种常见的用法。
  pub fn next_states(&self, states: &HashSet<S>, symbol: &Option<T>) -> HashSet<S> {
    states.iter().flat_map(|state| {
      // error goes here: borrowed value does not live long enough
      self.next_states_for(state, symbol).into_iter()
    }).collect()
  }