2016-06-12 6 views
0

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); 
} 

はこれを行うには良い方法はありますか?

答えて

2

SomeCommandの中に格納するのではなく、​​のパラメータとして変更可能な参照を渡すといいと思います。参照を生存させるのに必要な時間より長く生きていないようにしてください。

しかし、これはかなり広い質問です。私は十数個の解決策を考えています。あなたの例がかなり一般的であるため、あなたの場合に何が最善であるかを知るのは難しいです。おそらく、私たちにもう少し話していただければ、より具体的になるかもしれません(あなたが実装したい機能の小さなサブセットかもしれません)。

あなたの投稿のタイトルを見てみると:docoptは多くのRustプロジェクトで使用されています - AFAIKでもcargoが使用しています。しかし、私はそれが主な設計上の問題にあなたを助けないと思う。


さらに:newメソッドでは、暗黙の復帰のおかげでいくつかのコードを削除できます。この:

pub fn new(field: String) -> SomeStruct { 
    let some_struct = SomeStruct { 
     some_field: field, 
    }; 
    return some_struct; 
} 

が...このようになります。私は、応答に感謝

pub fn new(field: String) -> SomeStruct { 
    SomeStruct { 
     some_field: field, 
    } 
} 
+0

まあおかげで。私は基本的に、コマンドに応じて必要ないくつかの異なるオブジェクトを持っていて、それぞれの依存関係のあるコマンドごとに別々のリストを持つことは望まない。それでもC + + hehにしようとしています。 – Jim

+0

あなたのプログラム 'foo'は、' foo add '、' foo delete '、' foo add '、' foo delete 'などのように呼び出すことができますか?次に、4つの 'Command'オブジェクトがあります。すべてのコマンドを総括的に扱えるようになる方法はわかりません。あなたは異なるコードを実行するいくつかの異なるケースを持つ必要があります。たとえば、ユーザーとグループに関する情報の取得は、2つの異なる操作です。要するに、あなたが考えているデザインが助けになるとは思わない。おそらくCodeReview-Stackexchangeでコードを投稿することができます。 –

+0

@LukasKalbertodt:CodeReviewは作業コード(つまり、コンパイルして実行し、期待通りの結果を出すコード)です。 –

関連する問題