【发布时间】:2016-05-29 11:38:44
【问题描述】:
我正在制作一个机器人。当机器人收到消息时,它需要检查所有命令是否触发消息,如果是,则执行操作。
所以我在主结构中有一个命令向量(Command trait):
struct Bot {
cmds: Vec<Box<Command>>,
}
一切都很好,直到我尝试列出触发命令并稍后在(&self mut) 方法中使用它们:
let mut triggered: Vec<Box<command::Command>>;
for c in &self.cmds {
if c.check(&message) {
triggered.push(c.clone());
}
}
错误:
bot.rs:167:44: 167:56 error: mismatched types:
expected `Box<Command>`,
found `&Box<Command>`
(expected box,
found &-ptr) [E0308]
我在这里做错了什么?我尝试了很多,但没有任何帮助。 最初我在做以下事情:
for c in &self.cmds {
if c.check(&message) {
c.fire(&message, self);
}
}
但它给了我:
bot.rs:172:46: 172:50 error: cannot borrow `*self` as mutable because `self.cmds` is also borrowed as immutable [E0502]
bot.rs:172
c.fire(&message, self);
所以我stackoverflowed它并来到了上面的解决方案。
【问题讨论】:
-
请提供minimal reproducible example 以允许其他人重现您遇到的问题。否则,我们必须做出如此多的猜测来构建代码,我们可能会产生错误的东西。
-
首先,您可能不应该创建 Vec
>,因为向量会将其所有元素都分配到堆上,因此再次装箱只会减慢元素创建速度.
标签: vector rust borrow-checker