2017-12-04 5 views
0

イテレータのアイテムに対して最も慣れ親しんだ方法は何ですか?たとえば、コマンドライン引数を使用する場合、項目の1つでパターンマッチングを使用する最良の方法は何ですか?イテレータのアイテムとのマッチング方法は?

let args: Vec<String> = env::args().skip(1).collect(); 
match args[0].as_ref() {...} 
+0

はすでにルスト文字列リテラルに対して文字列に一致する方法[例えば(過去に答えたのですか? ](https://stackoverflow.com/questions/25383488/how-to-match-a-string-against-string-literals-in-rust))、私はプログラムの議論や、より一般的には、イテレータのアイテム。 – ljedrz

+0

ありがとう、そのリンクは私が実際にas_ref()について学んだところです。私はそれを使用し、それはうまく動作しますが、そのインデックス上のメソッドを呼び出す必要がある理由についてちょうど混乱していました。 –

+1

パターンの 'String'が'&str'文字列スライスとして扱われ、 'match'ボディのスライスとマッチするように' as_ref() 'が必要です。 – ljedrz

答えて

1

env::args()はイテレータ(Args)を返すので、あなたと同じように操作することができます:これは私がやっているとas_ref()が必要とされ、なぜ&args[0]が動作しない理由を、私は100%わからないものです他のイテレータ。あなたが一度与えられたアイテムに対して一致させたい場合は、それは次のようになり最も簡単な方法:文字列に対して一致するので

use std::env; 

fn main() { 
    let mut args = env::args().skip(1); 

    match args.next() { 
     Some(x) => { 
      if &x == "herp derp" { ... } 
     }, 
     None =>() 
    } 
} 
+0

@AliYazdani私は、実際に引数の値と一致するように答えを修正しました。 – ljedrz

+0

美しさ!ありがとう。 LOL "herp derp"。もう1つの質問(答えたいのであれば)は、最初にVecを使用していました。なぜなら、ランタイムまではサイズが分からないので、ヒープに割り当てられる必要があると思ったからです。コンパイラのデータ要件を明示せずにバージョンを動作させるメカニズムは何ですか? –

+1

@AliYazdani引数文字列はまだヒープ上にあります。それを使うことができるようにするためには、Vecに集める必要はありません。 – ljedrz

関連する問題