Rustにコマンドラインサーバーアプリケーションを実装しようとしています。 私はコマンドのリスト(またはハッシュテーブル)を使用して、使用法の印刷やコマンドの検索/実行を繰り返すことができます。Rustのコマンドパターン
私の問題は、各Command
は、コマンドを実行して(データベースにユーザーを挿入するなど)、変更可能な参照が必要であるということです。借用チェッカーは明らかに複数の可変参照を渡すのが好きではありません。これを行う方法はありますか?私はexecute
メソッドに必要なものへの参照を取り入れることから始めましたが、扱いにくいように聞こえるさまざまなものを必要とするコマンドに対して別のリストが必要でした。ここで
は、問題の例です:
struct SomeStruct {
pub some_field: String,
}
impl SomeStruct {
pub fn new(field: String) -> SomeStruct {
let some_struct = SomeStruct {
some_field: field,
};
return some_struct;
}
pub fn change_field(&mut self) {
self.some_field = "Something else".to_string();
}
}
struct SomeCommand<'a> {
pub some_struct: &'a mut SomeStruct,
}
impl<'a> SomeCommand<'a> {
pub fn new(the_struct: &'a mut SomeStruct) -> SomeCommand {
let some_command = SomeCommand {
some_struct: the_struct,
};
return some_command;
}
pub fn execute(&mut self) {
self.some_struct.change_field();
}
}
fn main() {
let mut some_struct = SomeStruct::new("hey".to_string());
let some_command1 = SomeCommand::new(&mut some_struct);
// Compiler complains because I'm making another mutable binding to some_struct
let some_command2 = SomeCommand::new(&mut some_struct);
}
はこれを行うには良い方法はありますか?
まあおかげで。私は基本的に、コマンドに応じて必要ないくつかの異なるオブジェクトを持っていて、それぞれの依存関係のあるコマンドごとに別々のリストを持つことは望まない。それでもC + + hehにしようとしています。 – Jim
あなたのプログラム 'foo'は、' foo add '、' foo delete '、' foo add '、' foo delete 'などのように呼び出すことができますか?次に、4つの 'Command'オブジェクトがあります。すべてのコマンドを総括的に扱えるようになる方法はわかりません。あなたは異なるコードを実行するいくつかの異なるケースを持つ必要があります。たとえば、ユーザーとグループに関する情報の取得は、2つの異なる操作です。要するに、あなたが考えているデザインが助けになるとは思わない。おそらくCodeReview-Stackexchangeでコードを投稿することができます。 –
@LukasKalbertodt:CodeReviewは作業コード(つまり、コンパイルして実行し、期待通りの結果を出すコード)です。 –