【问题标题】:How can a local variable be assigned in previous iteration of loop如何在循环的先前迭代中分配局部变量
【发布时间】:2022-01-08 11:40:27
【问题描述】:

只是一个问题,以便我更好地理解 Rust。

为什么会失败:

for event in rulesengine::RuleEvent::into_enum_iter()
{
  let mut event_stats: payloads::EventStats;
  event_stats.name = rulesengine::RuleEvent::to_string(&event);
  event_stats.event_count = event_counters.event_count[event as usize];
  event_stats.event_participant_count = event_counters.event_participant_count[event as usize];
  event_stats.event_trigger_count = event_counters.event_trigger_count[event as usize];
  rules_stats.event_stats.push(event_stats);
}

与:

error[E0382]: assign to part of moved value: `event_stats`
   --> src/motion.rs:317:37
    |
316 | ...                       let mut event_stats: payloads::EventStats;
    |                               --------------- move occurs because `event_stats` has type `payloads::EventStats`, which does not implement the `Copy` trait
317 | ...                       event_stats.name = rulesengine::RuleEvent::to_string(&event).clone();
    |                           ^^^^^^^^^^^^^^^^ value partially assigned here after move
...
323 | ...                   },
    |                       - value moved here, in previous iteration of loop

error: aborting due to previous error

当这工作时:

for event in rulesengine::RuleEvent::into_enum_iter()
{
  let name = rulesengine::RuleEvent::to_string(&event);
  let event_count = event_counters.event_count[event as usize];
  let event_participant_count = event_counters.event_participant_count[event as usize];
  let event_trigger_count = event_counters.event_trigger_count[event as usize];
  let event_stats = payloads::EventStats { name, event_count, event_participant_count, event_trigger_count };
  rules_stats.event_stats.push(event_stats);
}

甚至更好

for event in rulesengine::RuleEvent::into_enum_iter()
{
  let event_stats = payloads::EventStats
  {
    name: rulesengine::RuleEvent::to_string(&event),
    event_count: event_counters.event_count[event as usize],
    event_participant_count: event_counters.event_participant_count[event as usize],
    event_trigger_count: event_counters.event_trigger_count[event as usize],
  };
  rules_stats.event_stats.push(event_stats);
}

变量 event_stats 是可变的,但是是局部的。它在要移动的“循环的前一次迭代”中不存在。

【问题讨论】:

  • 那是正确的代码吗?为什么错误消息说第 323 行是},?我没有看到上面的 }, 行。
  • 对不起,我试图简化一下。我应该刚刚创建了一个新程序来演示。

标签: loops rust move


【解决方案1】:

我认为该错误是对问题的误诊。过去有compiler bugs 消息错误地将循环归咎于未初始化的变量。或许这是另外一种情况。


核心问题是您试图将字段分配给未初始化的值:

let mut event_stats: payloads::EventStats;
event_stats.name = ...;

您已声明event_stats,但尚未初始化它。 Rust 不允许您分段初始化结构,至少在没有 a lot of extra juggling 的情况下不允许。

您的两个工作解决方案都从结构文字创建 event_stats

let event_stats = payloads::EventStats { name: ..., ... };

这是初始化结构的正确方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-14
    • 1970-01-01
    • 2021-04-12
    • 2012-09-10
    • 1970-01-01
    • 2019-06-01
    • 1970-01-01
    • 2015-04-08
    相关资源
    最近更新 更多