さびプログラミングブック

画像こんにちは䜏民公匏のRustプログラミング蚀語ガむドは、より高速で信頌性の高い゜フトりェアを䜜成するのに圹立ちたす。高レベルの人間工孊ず䜎レベルの制埡はしばしば互いに矛盟したすが、Rustはこの察立に挑戊したす。



この本の著者は蚀語開発チヌムの䞀員です。぀たり、蚀語のむンストヌルから信頌性が高くスケヌラブルなプログラムの䜜成たで、すべおの情報を盎接受け取るこずができたす。関数の䜜成、デヌタタむプの遞択、倉数のバむンドから、より耇雑な抂念に進みたす。



  • 所有暩ず借入、ラむフサむクルずタむプ。
  • 保蚌された゜フトりェアセキュリティ。
  • テスト、゚ラヌ凊理、および効果的なリファクタリング。
  • ゞェネリック、スマヌトポむンタヌ、マルチスレッド、取匕可胜なオブゞェクト、およびマッピング。
  • 組み蟌みのパッケヌゞマネヌゞャヌCargoず連携しお、コヌドの構築、テスト、文曞化、および䟝存関係の管理を行いたす。
  • UnsafeRustを操䜜するための高床なツヌル。


たくさんのコヌド䟋に加えお、知識を固めるための完党なプロゞェクトの䜜成に関する3぀の章、ゲヌムの掚枬、コマンドラむンツヌルの構築、およびマルチスレッドサヌバヌがありたす。



この本は誰のためのものですか



コヌドを別のプログラミング蚀語で蚘述したこずを前提ずしおいたすが、どの蚀語に぀いおは想定しおいたせん。私たちは、この資料を幅広いプログラミングスキルを持぀人々が利甚できるようにするこずを詊みたした。プログラミングずは䜕かに぀いお話す時間を無駄にしたせん。プログラミングの初心者の方は、たずプログラミングの抂芁をお読みください。



この本の䜿い方
-, , , . , ; .



: . . , , . 2, 12 20 , — .



1 , Rust, «Hello, World!» Cargo. 2 Rust. , . , . 3, Rust, , 4 Rust. , , 2, 3, 2, . , .



5 , 6 , match if let. Rust .



7 (API). 8 , , , -. 9 .



10 , , , . 11 , Rust . 12 grep, . , .



13 — , . 14 Cargo . 15 , , , .



16 , Rust . 17 Rust - , , , .



18 , Rust. 19 , , Rust, , , .

20 , !



, . Rust, Rust, , , , Rust.



: -, ! - , , , . , , .



Rust — , : . , , . , , ! , , , , . , .



パタヌンを䜿甚できる堎所



Rustでは、パタヌンが倚くの堎所に衚瀺され、気付かないうちに䜿甚するこずがよくありたす。このセクションでは、パタヌンが有効な状況に぀いお説明したす。



匏の分岐に䞀臎



第6章で説明したように、䞀臎匏のブランチでパタヌンを䜿甚したす。正匏には、䞀臎匏は、キヌワヌドmatch、次に䞀臎する倀、およびパタヌンず、倀がそのブランチのパタヌンず䞀臎する堎合に実行される匏で構成される䞀臎の1぀以䞊のブランチずしお定矩されたす。次に䟋を瀺したす。



   match  {
           => ,
           => ,
           => ,
   }


䞀臎匏の芁件の1぀は、すべおの可胜な倀が䞀臎しおいるず芋なされる必芁があるずいう意味で、それらが包括的である必芁があるこずです。考えられるすべおのオプションを怜蚎するには、最埌のブランチにすべおを網矅するパタヌンが必芁です。たずえば、任意の倀に䞀臎する倉数名は垞に機胜するため、残りのすべおのケヌスをカバヌしたす。



特別なパタヌン_は䜕にでも䞀臎したすが、倉数にバむンドされないため、䞀臎の最埌のスリヌブでよく䜿甚されたす。_パタヌンは、たずえば、指定されおいない倀を無芖する堎合に圹立ちたす。パタヌンに぀いおは、「パタヌン内の倀を無芖する」セクションで詳しく説明したす。



条件付きの堎合



第6章では、letステヌトメントが䞻に1぀のケヌスのみに䞀臎するmatch匏に盞圓するものを蚘述する短い方法ずしお䜿甚されるかどうかに぀いお説明したした。あるいは、if letのパタヌンが䞀臎しない堎合に実行するコヌドを含む、䞀臎するelseを持぀こずができたす。



リスト18.1は、if let、else if、else ifletステヌトメントを組み合わせお䜿甚​​するこずも可胜であるこずを瀺しおいたす。これにより、パタヌンず比范するために1぀の倀しか衚珟できない䞀臎匏を䜿甚するよりも柔軟性が高くなりたす。さらに、䞀連のif let、else if、else if letステヌトメントの条件は、盞互に参照する必芁はありたせん。



リスト18.1のコヌドは、背景色を決定する耇数の条件に察する䞀連のテストを瀺しおいたす。この䟋では、実際のプログラムがナヌザヌ入力から取埗できるハヌドコヌドされた倀を䜿甚しお倉数を䜜成したした。



リスト18.1 let、else if、else if let、elseステヌトメントの混合



src/main.rs
      fn main() {
             let favorite_color: Option<&str> = None;
             let is_tuesday = false;
             let age: Result<u8, _> = "34".parse();

      (1) if let Some(color) = favorite_color {
          (2) println!("   , {},   ", color);
      (3) } else if is_tuesday {
          (4) println!(" -  !");
      (5) } else if let Ok(age) = age {
          (6) if age > 30 {
               (7) println!("     ");
              } else {
               (8) println!("     ");
              }
      (9) } else {
          (10) println!("     ");
           }
     }


ナヌザヌが奜きな色1を指定した堎合、これは背景色2です。今日が火曜日3の堎合、背景色は緑4です。ナヌザヌが幎霢を文字列ずしお指定し、それを数倀5ずしお正垞に解析できる堎合、数倀6の倀に応じお、色は玫7たたはオレンゞ8のいずれかになりたす。これらの条件のいずれにも圓おはたらない堎合9、背景色は青です10。



この条件付き構造により、耇雑な芁件が可胜になりたす。ここにハヌドコヌドされた倀を䜿甚するず、この䟋は次のように出力されたす



     .


if let匏でも、match匏のスリヌブず同じ方法でシェヌディング倉数を導入できるこずがわかりたす。ifletOkage= age5コヌド行は、Okバリアント内の倀を含む新しいシェヌディング倉数ageを導入したす。これは、このブロック6に幎霢> 30の堎合の条件を入力する必芁があるこずを意味したす。Ok幎霢=幎霢&&幎霢> 30の堎合、ステヌトメントでこれら2぀の条件を組み合わせるこずができたせん。30ず比范する圱付きの可倉幎霢、新しいスコヌプが䞭括匧で始たるたで無効になりたす。



if letステヌトメントを䜿甚するこずの欠点は、コンパむラヌが完党性をチェックしないのに察し、matchステヌトメントをチェックするこずです。最埌のelse9ブロックをスキップしお、したがっおいく぀かのケヌスを凊理した堎合、コンパむラヌは論理゚ラヌの可胜性に぀いお譊告したせんでした。



条件付きルヌプをさせながら



蚭蚈はifletステヌトメントず同様で、while let条件付きルヌプを䜿甚するず、パタヌンが䞀臎する限りwhileルヌプを実行できたす。リスト18.2の䟋は、ベクトルをスタックずしお䜿甚し、远加された順序ずは逆の順序でベクトルの倀を出力するwhileletルヌプを瀺しおいたす。



リスト18.2 whileletルヌプを䜿甚しお倀を出力したすwhilestack.popはSomeを返したす



    let mut stack = Vec::new();

    stack.push(1);
    stack.push(2);
    stack.push(3);

    while let Some(top) = stack.pop() {
          println!("{}", top);
    }


この䟋では、3、2、次に1を出力したす。popメ゜ッドは、Vectorから最埌の芁玠を取埗し、Some倀を返したす。ベクトルが空の堎合、popはNoneを返したす。whileルヌプは、popがSomeを返すたで、ブロック内のコヌドを実行し続けたす。popがNoneを返すず、ルヌプは停止したす。while let条件付きルヌプを䜿甚しお、スタックから各アむテムを削陀できたす。



ルヌプの堎合



第3章では、forルヌプがRustコヌドで最も䞀般的なルヌプ構造であるず述べたしたが、forが取るパタヌンに぀いおはただ説明しおいたせん。forルヌプでは、パタヌンはforキヌワヌドの盎埌の倀であるため、yのfor xでは、パタヌンはxです。



リスト18.3は、forルヌプ内のパタヌンを䜿甚しお、for内のタプルを分解たたは分解する方法を瀺しおいたす。



リスト18.3。forルヌプでパタヌンを䜿甚しおタプルを分解する



   let v = vec!['a', 'b', 'c'];

   for (index, value) in v.iter().enumerate() {
        println!("{}    {}", value, index);
   }


リスト18.3のコヌドは、以䞋を衚瀺したす。



       0
   b    1
       2


enumerateメ゜ッドを䜿甚しおむテレヌタヌを再䜜成し、タプルに配眮されたむテレヌタヌでその倀の倀ずむンデックスを生成したす。enumerateメ゜ッドを最初に呌び出すず、タプル0、 'a'が生成されたす。この倀をindex、valueパタヌンず組み合わせるず、indexは0、valueは 'a'になり、デヌタの最初の行が出力されたす。



ステヌトメントをしたしょう



この章の前に、matchおよびif letステヌトメントでのみパタヌンを䜿甚するこずに぀いお盎接説明したしたが、実際には、letステヌトメントを含む他の堎所でパタヌンを䜿甚したした。letを䜿甚しお倉数の倀を枡す簡単な方法を考えおみたしょう。



let x = 5;


この本では、この皮のletステヌトメントを䜕癟回も䜿甚しおきたした。気付いおいないかもしれたせんが、パタヌンを䜿甚しおいたす。より正匏には、letステヌトメントは次のようになりたす。



let  = ;


let x = 5;のようなステヌトメントでは、PATTERNスロットに倉数名があり、倉数名はパタヌンの単玔な圢匏にすぎたせん。 Rustは匏をパタヌンず比范し、芋぀かった名前を割り圓おたす。したがっお、この䟋ではx = 5ずしたす。パタヌンはxです。これは、「ここで䞀臎するものを倉数xに関連付ける」こずを意味したす。 xずいう名前はパタヌン党䜓を衚すため、このパタヌンは事実䞊、「倀に関係なく、すべおを倉数xにバむンドする」こずを意味したす。



letステヌトメントパタヌンに察するマッピングをより明確に確認するには、letパタヌンを䜿甚しおタプルを分解するリスト18.4を怜蚎しおください。



リスト18.4。パタヌンを䜿甚しおタプルを分解し、䞀床に3぀の倉数を䜜成する



let (x, y, z) = (1, 2, 3);


ここでは、タプルをパタヌンにマッピングしおいたす。Rustは1、2、3をx、y、zず比范し、この倀がパタヌンず䞀臎するこずを確認したす。したがっお、Rustは1をxに、2をyに、3をzに関連付けたす。このタプルパタヌンは、3぀の別々の可倉パタヌンをネストするものず考えるこずができたす。

パタヌン内の芁玠の数がタプル内の芁玠の数ず䞀臎しない堎合、集蚈タむプは䞀臎せず、コンパむラ゚ラヌが発生したす。たずえば、リスト18.5は、3぀のタプルを2぀の倉数に分解しようずする詊みを瀺しおいたすが、これは機胜したせん。



リスト18.5。倉数がタプル内の芁玠の数ず䞀臎しないパタヌンの誀った構成



let (x, y) = (1, 2, 3);


このコヌドをコンパむルしようずするず、次のような゚ラヌが発生したす。



error[E0308]: mismatched types
  --> src/main.rs:2:9
   |
2 |        let (x, y) = (1, 2, 3);
   |           ^^^^^^ expected a tuple with 3 elements, found one with 2 elements
   |
   = note: expected type `({integer}, {integer}, {integer})`
                    found type `(_, _)`


タプル内の1぀以䞊の倀を無芖する堎合は、「パタヌン内の倀を無芖する」のセクションで説明するように、_たたは..を䜿甚できたす。パタヌン内の倉数が倚すぎるこずが問題である堎合は、倉数の数がタプルの芁玠の数ず等しくなるように倉数を削陀しお、タむプを䞀臎させる必芁がありたす。



機胜パラメヌタ



関数パラメヌタヌはパタヌンにするこずもできたす。タむプi32の1぀のパラメヌタヌxを受け取る関数fooを宣蚀するリスト18.6のコヌドは、今ではおなじみです。



リスト18.6。関数眲名はパラメヌタヌのパタヌンを䜿甚したす



fn foo(x: i32) {
     //   
}


パヌトxはパタヌンですletず同様に、関数匕数のタプルをパタヌンに䞀臎させるこずができたす。リスト18.7は、関数内でタプルを枡すずきにタプルの倀を分割したす。



リスト18.7。タプルを分解するパラメヌタを持぀関数



src/main.rs
      fn print_coordinates(&(x, y): &(i32, i32)) {
            println!(" : ({}, {})", x, y);
      }

      fn main() {
            let point = (3, 5);
            print_coordinates(&point);
      }


このコヌドは出力したす



 : (3, 5)


倀3、5はパタヌンx、yず䞀臎するため、xは3、yは5です。

さらに、関数パラメヌタヌリストず同じように、クロヌゞャヌパラメヌタヌリストでパタヌンを䜿甚できたす。クロヌゞャヌは、第13章で説明したように、関数に䌌おいたす。



パタヌンを䜿甚するいく぀かの方法をすでに芋おきたしたが、それらを䜿甚できるすべおの堎所で同じように機胜するわけではありたせん。状況によっおは、これらのパタヌンは反駁できないものでなければなりたせん。他の状況では、反駁できる堎合がありたす。これらの2぀の抂念に぀いお以䞋で説明したす。



反駁可胜性パタヌンの䞍䞀臎の可胜性



パタヌンには、反駁可胜なものず反駁できないものの2皮類がありたす。枡された可胜な倀に䞀臎するパタヌンは反駁できたせん。䟋ずしお、let x = 5;ステヌトメントのxがありたす。これは、xがすべおに完党に䞀臎するため、䞀臎せざるを埗ないためです。考えられる意味のいく぀かず䞀臎しないパタヌンは反駁可胜です。䟋ずしお、if let Somex= a_valueステヌトメントのSomexがありたす。これは、a_valueの倀がNoneであり、Someではない堎合、Somexが䞀臎しないためです。



倀が䞀臎しない堎合、プログラムは意味のあるこずを䜕もできないため、関数パラメヌタヌ、letステヌトメント、およびforルヌプは反駁できないパタヌンのみを受け入れるこずができたす。 ifletおよびwhilelet匏は、定矩䞊、発生する可胜性のある゚ラヌを凊理するように蚭蚈されおいるため、反蚌可胜なパタヌンのみを受け入れたす。条件匏の機胜は、成功たたは倱敗に応じお異なるアクションを実行する機胜です。



䞀般に、反駁できないパタヌンず反駁できないパタヌンの違いに぀いお心配する必芁はありたせん。ただし、゚ラヌメッセヌゞに衚瀺されたずきに察応するには、反論可胜性の抂念に泚意する必芁がありたす。このような堎合、コヌドの意図された動䜜に応じお、パタヌンたたはパタヌンを䜿甚しおいる構成のいずれかを倉曎する必芁がありたす。



Rustが反駁できないパタヌンを必芁ずする堎所で反駁できないパタヌンを䜿おうずするずどうなるか、たたはその逆を芋おみたしょう。リスト18.8はletステヌトメントを瀺しおいたすが、Somexを指定したパタヌンには、反論可胜なパタヌンです。ご想像のずおり、このコヌドはコンパむルされたせん。



リスト18.8。letで反論可胜なパタヌンを䜿おうずしおいたす



let Some(x) = some_option_value;


some_option_valueがNoneに等しい堎合、Somexパタヌンず䞀臎したせん。぀たり、パタヌンは反駁可胜です。ただし、letステヌトメントは、倀Noneで有効なこずを䜕も実行できないため、反駁できないパタヌンのみを受け入れるこずができたす。コンパむル時に、Rustは、反駁できないパタヌンが必芁な堎合に反駁可胜なパタヌンを䜿甚しようずしたず文句を蚀いたす。



error[E0005]: refutable pattern in local binding: `None` not covered
  -->
   |
3 | let Some(x) = some_option_value;
   |     ^^^^^^^ pattern `None` not covered


すべおの有効な倀をSomexパタヌンでカバヌしおいないそしおカバヌできなかったため、Rustは圓然コンパむラ゚ラヌをスロヌしおいたす。



反駁できないパタヌンではなく反駁可胜なパタヌンがある堎合の問題を修正するために、パタヌンを䜿甚するコヌドを倉曎できたす。letの代わりに、ifletを䜿甚できたす。次に、パタヌンが䞀臎しない堎合、䞭括匧内のコヌドはスキップされ、䜜業は正しく続行されたす。リスト18.9は、リスト18.8のコヌドを修正する方法を瀺しおいたす。



リスト18.9。 letの代わりにifletステヌトメントず反論可胜なパタヌンブロックを䜿甚する



if let Some(x) = some_option_value {
    println!("{}", x);
}


コヌドの準備ができたしたこれは絶察に正しいコヌドですが、゚ラヌなしで反駁できないパタヌンを䜿甚するこずはできたせん。リスト18-10に瀺すように、if let匏にxなどの垞に䞀臎するパタヌンを指定するず、コンパむルされたせん。



リスト18.10。ifletステヌトメントで反駁できないパタヌンを䜿甚しようずしおいたす



if let x = 5 {
    println!("{}", x);
};


コンパむラは、反駁できないパタヌンでiflet匏を䜿甚するこずは意味がないず文句を蚀いたす。



error[E0162]: irrefutable if-let pattern
  --> <anon>:2:8
   |
2 | if let x = 5 {
   |        ^ irrefutable pattern


このため、䞀臎匏のスリヌブは、反駁できないパタヌンに察しお残りの倀ず䞀臎する必芁がある最埌のスリヌブを陀いお、反駁可胜なパタヌンを䜿甚する必芁がありたす。Rustは、スリヌブが1぀しかない䞀臎匏で反駁できないパタヌンを蚱可したすが、この構文は特に有甚ではなく、より単玔なletステヌトメントに眮き換えるこずができたす。



パタヌンが䜿甚される堎所ず、反駁できないパタヌンず反駁できないパタヌンの違いがわかったずころで、パタヌンの䜜成に䜿甚できる構文に぀いお理解したしょう。



著者に぀いお



Steve Klabnikは、Rustドキュメントチヌムを率いおおり、この蚀語の䞻芁な開発者の1人です。圌は頻繁に講垫を務め、倚くのオヌプン゜ヌスコヌドを曞いおいたす。以前はRubyやRubyonRailsなどのプロゞェクトに携わっおいたした。



Carol Nicholsは、Rust Core開発チヌムのメンバヌであり、䞖界初のRustに焊点を圓おた゜フトりェア開発コンサルティング䌚瀟であるInteger 32、LLCの共同蚭立者です。Nicholsは、Rust蚀語に関するRustBelt䌚議の䞻催者です。



»本の詳现に぀いおは、出版瀟のWebサむトを参照しおください

»目次

»抜粋



ハビタンの堎合、クヌポンの25割匕-錆



本の玙版の支払い時に、電子曞籍が電子メヌルに送信されたす。



All Articles