Rustは、現在最も注目を集めているプログラミング言語の1つ。安全性と高性能を両立しているのが特徴だ。この連載では、Web開発を題材にRustの使い方を学んでいく。

Web開発で学ぶ最新言語Rust
目次
-
クラウドでも使えるRust、AWS Lambdaでコードを動かしてみる
Rustはクラウドサービスでも利用できる。今回は、アマゾンウェブサービス(AWS)でのRustの利用について簡単に見ていく。
-
かゆいところに手が届く、Rustの便利なクレートを使ってみよう
アプリケーションの開発時に筆者がよく利用する3つのクレートを紹介しよう。「async-trait」「itertools」「validator」だ。
-
Rustの便利なクレートを使いこなそう、エラーハンドリングもラクラク
今月は、RustでWebアプリケーションを開発している際によく利用するクレートをケース別に紹介しよう。Rustを使ったソフトウエア開発に生かしてもらえれば幸いだ。
-
更新と削除の機能を実装、Rustによる書籍在庫管理Webアプリが完成
書籍の在庫管理を行うアプリケーションを例に、RustによるWebアプリケーション開発について解説している。ここまでで書籍の情報閲覧機能と登録機能を実装した。書籍コメントの更新機能と書籍の削除機能を実装してアプリケーションを完成させよう。
-
実用的なWebアプリには不可欠なCRUD、まず登録機能をRustで実装する
先月からRustを使ってWebアプリケーションの開発を解説している。例として取り上げているのは書籍の在庫管理を行うアプリケーションだ。このアプリケーションの実装を拡張し、書籍の登録、更新、削除ができるように実装を進めていく。
-
Rustではどう書く?データベースから書籍情報を取得するAPI
RustによるWeb開発を引き続き解説しよう。前回は、アプリケーションが正常に動いているかどうかを確認するヘルスチェック用APIを実装した。今回は、データベースから書籍情報を取得するAPIを実装する。
-
いよいよRustでWeb開発!書籍管理アプリの実装で基礎を学ぶ
いよいよ本格的にRustによるWeb開発を進めていこう。サンプルとして実装するWebアプリケーションは「書籍の在庫管理」を行うものだ。とりあえず「アプリケーションの死活監視」と「登録済みの書籍の一覧表示」とができるようにする。
-
「async」と「await」をつけるだけ!強力なRustの非同期処理
HTTPサーバーには、クライアントからリクエストが来た順番に処理する「反復サーバー」とイベントを切り替えながらリクエストを処理する「並行サーバー」がある。今回は、反復サーバーを基に並行サーバーを実装する。Rustでは思ったよりも手軽に非同期処理を実装できることを実感できるはずだ。
-
単純なHTTPサーバーをRustで実装し、処理の流れを把握する
HTTPサーバーには、クライアントからリクエストが来た順番に処理する「反復サーバー」とイベントを切り替えながらリクエストを処理する「並行サーバー」がある。今回は前者の反復サーバーを実装する。
-
Rustによる自作サーバーでHTTPの基礎と非同期処理を学ぶ
今月はRustにおける非同期処理を見ていこう。RustでWebアプリケーションを開発する際には、非同期処理は避けて通れない。実際に手を動かすことで、Web開発の基本であるHTTPサーバーの仕組みと非同期処理の基礎を同時に学ぶことができる。
-
共有すると値は変更不可?この問題を解決するRustの「内部可変性」
前回紹介した「Rc(参照カウント)」には少し使いにくい面がある。今回は、それを補う「RefCell」というスマートポインターを紹介する。
-
参照カウントをうまく使い、Rustコンパイラーの厳しいチェックを回避
今回は、Boxと並んでよく使われるスマートポインター「Rc」、すなわち「参照カウント」について見ていこう。1つのノードを2つのノードから共有するリストについて考えてみる。
-
Rustでは「所有権」が足かせになるリストの実装、その解決策とは
Rustにはメモリー安全性を担保するために「所有権」という仕組みがある。しかし所有権は、いくつかのデータ構造の実装において障害になることがある。この問題に対処するには、Rustに備わっている「スマートポインター」という機能を利用する。
-
Rustの「トレイト」にもう1つの使い方、様々な機能を手軽に切り替える
Rustのトレイトは、処理の共通化以外にも使われることがある。トレイトを実装していることを型に求める「トレイト境界」を利用し、トレイト境界を満たした場合に特定の機能を有効にするといった使い方をするケースがある。
-
型を操るのに不可欠なRustの「トレイト」、共通の振る舞いを指定する
今回はRustのトレイトについて説明する。トレイトは型に対して共通の振る舞いを設定できるようにする機能だ。
-
これぞ抽象化の威力、型をまとめて扱えるRustの「ジェネリクス」
Rustのジェネリクスという機能を利用すると「適用される型が異なるだけで、処理の根幹は同じ」というケースをまとめられる。プログラムの再利用性が高まるといった実務上のメリットもある。
-
Rustの革新性を支える「ライフタイム」、メモリー関連の脆弱性を防ぐ
プログラムでは「値のライフタイム」と「参照のライフタイム」の2種類がある。Rustでは、参照のライフタイムをコンパイル時に解析し、不適切な場合にはコンパイルエラーとして検出する。Rustのメモリー安全性を支える根本がライフタイムである。
-
Rustの所有権に不可欠の知識、コピーや借用について理解する
Rustに「所有権」という概念がある。これを理解するには、ムーブとコピーの違い、借用という概念を理解する必要がある。
-
他の言語で動くコードがRustでは動かない、鬼門の「所有権」を理解する
今月は、Rustで理解が難しい「鬼門」とよく言われる「所有権」や「ライフタイム」といった概念を解説する。これらはルールを知っただけではなかなか理解するのが難しい概念だ。習うより慣れろの精神で体得していくのがよいと筆者は考えている。サンプルコードを動かしながら読み進めてほしい。
-
Rustの型を駆使して検索コマンド「grep」を実装してみよう
ここまでで紹介した型をいくつか使いながら、「grep」というコマンドを実装してみよう。grepは、ファイルの中から「文字列(パターン)」を探し出し、それが含まれている行を表示するコマンドだ。