スポンサーリンク

Rustのパターンマッチングについて学んだ話 if let

if let文について。

端的にいうと、

  • if ... 式が true か false か で分岐を行う
  • if let ... パターンがマッチするか/しないか で分岐を行う

 

fn main() {

  let mytuple=(3,4,5);


  // (3,4,何でもいい) というタプルと (3,4,5) というタプルはマッチするので
  // if節が実行される
  if let (3,4,_) = mytuple{
    println!("mached ");
  }


  // (3 ,second, 何でもいい) というタプルと、(3,4,5)はマッチするので
  // secondが定義されて、mytuple.1 が代入される
  if let (3,second,_) = mytuple{

    println!("second element is {} ",second);
  }
  

  // (4,second,何でもいい) というタプルは、(3,4,5)とマッチしないので、
  // else 節へ行く
  if let (4,second,_) = mytuple{

    println!("second element is {}",second);

  }
  else {

    println!("not matched");

  }


}

if let はパターンマッチで分岐するので、match文に近い。matchが複数のパターンと比較するが、比較の対象が一つだけの時は書きやすいようにif letが用意されている。

あと、if letには網羅性がない。matchは網羅性があるので、必要なパターンを陳列し終わったら、「そのほかのケース」として_ を用意し、match文に用意された選択肢のどれか一つに必ずマッチするように書かなければならないが、ifはそうではない。

fn main() {

  let mytuple=(3,4,5);



  // mytuple と (3,second,_)  のマッチ
  match mytuple{
    (3,second,_)=>println!("first = 3, second = {}",second),
    _ => (),
  }

  // mytuple と (3,second,_)  のマッチ。
  // 比較対象が一つだけならif letのほうが直観的
  if let (3,second,_) = mytuple{
    println!("first = 3, second = {}",second);
  }

}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: