2016-12-03 39 views
2

よりさえも参照の所有権および借入に関する章を読んだ後、私は効果的にclap::Appから複数のメソッドを呼び出してから私を停止し、次のコードでいくつかのことを理解することはできません!このコードをコンパイルメソッドの呼び出しが複数回

extern crate clap; 
use clap::{App};   

fn main() { 
    let mut app = App::new("name me") 
     .args_from_usage("<input_file>   'Sets the input file to use'"); 
    let matches = app.get_matches(); 
    app.print_help(); 
    println!("Using input file: {}", matches.value_of("input_file").unwrap()); 
} 

がにつながる:私が正しく理解していれば

error[E0382]: use of moved value: `app` 
    --> src/main.rs: 
    | 
    |  let matches = app.get_matches(); 
    |     --- value moved here 
    |  app.print_help(); 
    |  ^^^ value used here after move 
    | 
    = note: move occurs because `app` has type `clap::App<'_, '_>`, which does not implement the `Copy` trait 

error: aborting due to previous error 
  1. app.get_matches()は、このようにappmutにする必要があり、所有権を借りるように求められます。関数が返ったら、所有権はどこに行きますか?
  2. 私はappはまだオブジェクトの所有権を持つことになり、まだコンパイラは異なる見解を持っていると思いました。

などの別のメソッドを有効に呼び出すにはどうすればappに入りますか?

答えて

1

function signature for App::get_matchesを読む:

fn get_matches(self) -> ArgMatches<'a> 

これは値によってselfをとること値を消費する、とも言えます。あなたはは、その後それ上の任意のメソッドを呼び出すことはできません。これについては何もしません。おそらく著者にはこれに対する良い理論があると思われる。

は今 App::print_helpを確認してください。

fn print_help(&mut self) -> ClapResult<()> 

それは(変更可能であることを起こる)の参照を取ります。このメソッドを呼び出すために所有権を移す必要はありません。


私が正しく理解していれば、app.get_matches()は、このようにアプリがmutにする必要があり、所有権を借りるように求められます。関数が返ったら、所有権はどこに行きますか?

あなたは、複数の次元で、正しく理解していません。

  1. get_matchesは値を消費しますが、何も借りません。
  2. 値が借りすることが可変である必要はありません。
  3. あなたが何かを借りて行うと、所有権はどこにも「行きません」。元の所有者は引き続きそれを所有しています。そのため、を借りてと呼ばれています。

はどうやってマッチを得ることができ、かつ効果的にまだ、そのようなその後、アプリのprint_helpとして、別のメソッドを呼び出しますか?

あなたはありません。明らかな回避策は、元のオブジェクトを複製して2番目の値を生成することです。次に、1つの値を消費し、2番目の値についてもメソッドを呼び出します。


基本的には、あなたがライブラリからやっていることをやめようとしているように思えます。おそらく、目標を再評価したり、図書館の意図された使用法を見直したりするべきです。たとえば、get_matchesは、ユーザーが要求したときに自動的にヘルプテキストを表示するので、なぜあなたのコードはそのようにしますか?

+0

ここに私の大きな誤解の光を放つためにありがとう!いくつかの点でちょっと変わった感じですね、最初は... – Jiehong

+0

@Jiehongええ、間違いなく学習曲線はありますが、ほとんどすべてが既存の理由があります。この場合、このライブラリがこのように設計されている理由を正確に説明できたらと思います。私が提供できる最良の方法は、 'clap :: App'ドキュメントがビルダーとしての自分自身を参照することです。一般に、いったんビルドすると、ビルダーはそのプロセスで消費されます。 – Shepmaster

+0

@Shepmasterはうまく説明しました。これを追加してもいいです:多くのコマンドラインツールは、 'java'や' cloc'を含む、裸のコマンド呼び出しに関する完全なヘルプを表示します。だから、@ Jiehongが拍手で完全なヘルプメッセージを提供してほしいと思うのは合理的だと思う。私はまだクラップでこの動作を提供する簡単な方法を発見していない。 –

関連する問題