2016-05-29 4 views
0

私はボットを作っています。ボットがメッセージを受信すると、メッセージをトリガーする場合はすべてのコマンドをチェックする必要があり、そうであればアクションを実行する必要があります。ボックス化された形質オブジェクトのベクターを他のベクターから作成する方法は?

だから私は、メイン構造体にあるコマンドのベクトル(Command形質を)持っている:私は、トリガコマンドのリストを作成すると(&self mut)方法で、後でそれらを使用しようとするまで

struct Bot { 
    cmds: Vec<Box<Command>>, 
} 

すべてが良いです:

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し、上記溶液に来ました。

+0

誰が問題にあなたを再現することを可能にすること[MCVE]してください持っている。さもなければ私たちは間違ったことを作り出すことができるコードを作るために多くの推測をしなければなりません。 – Shepmaster

+0

まず、Vec >を作るべきではありません。ベクターがそのすべての要素をヒープ上に割り当てるので、それらを再度ボクシングすると要素の作成が遅くなるからです。 –

答えて

1

What am I doing wrong here? I tried a lot but nothing helps. Initially I was doing the following:

for c in &self.cmds { 
    if c.check(&message) { 
     c.fire(&message, self); 
    } 
} 

fire機能は、オプションは一時的に空ベクターをself.cmdを交換することで、他のコマンドへのアクセスを必要としない場合:

trait Command { 
    fn check(&self, message: &str) -> bool; 
    fn fire(&mut self, bot: &Bot); 
} 

struct Bot { 
    cmds: Vec<Box<Command>>, 
} 

impl Bot { 
    fn test(&mut self, message: &str) { 
     use std::mem; 
     // replace self.cmds with a empty vector and returns the 
     // replaced vector 
     let mut cmds = mem::replace(&mut self.cmds, Vec::default()); 
     for c in &mut cmds { 
      if c.check(message) { 
       c.fire(self); 
      } 
     } 
     // put back cmds in self.cmds 
     mem::replace(&mut self.cmds, cmds); 
    } 
} 

このアプローチを使用other answersがあります。


fireBotの一部のフィールドにアクセスする必要がない場合は、代わりにselfでのみ必要なフィールドを渡すことができます。

c.fire(self.others) 
+0

OPは、 'Command'は構造体ではなく、特性であると述べています。これが私がMCVEを望む理由です...しかし、後半はおそらく正しい解決策です。 'self.messages'を反復するとき' self'を渡すことがなぜ無効であるのか、なぜ 'fire'が' messages'を変更しようとするかもしれないのか説明してください。あるいは、OPは「自己」を分割し、フィールドのサブセットを「発射」するだけでよい。 – Shepmaster

+0

@Shepmaster「コマンド」は特色であることを私に思い出させてくれてありがとう。私は質問がMCVEを提供しない時を見るのに慣れています...もし 'fire'が'&Bot'を受け取ったならば、 '' '' '' '' '' '' '' '' ''ここに堅い。 – malbarbo

関連する問題