【Rust入門】Rustの基礎とライブラリについて徹底解説!

はじめまして、エンジニアスタイル編集部です!
コラムページでは、ITフリーランスに向けてお役立ち情報を発信します。Twitterではホットな案件を紹介してまいりますので、ぜひフォローをお願いいたします!
本記事が、皆様の参考になれば幸いです。
経験がまだ少ない方にもわかりやすく説明するために、初歩的な内容も記載しております。記事も長いので、実務経験豊富な方は、ぜひ目次から関心のある項目を選択してください。
エンジニアスタイルは、最高単価390万円、国内最大級のITフリーランス・副業案件検索サービスです。Rustのフリーランス・副業案件一覧を以下からご覧いただけますのであわせてご確認ください。
目次
Rustとは?
Rustは、FireFoxを開発したMozillaが開発を支援するプログラミング言語です。
「ラスト」と呼ばれるオープンソースのプログラミング言語ですが、開発元のMozillaによって安定した開発が続けられています。
Rustは、C言語やC++のプログラミング言語の代替品として、信頼性、パフォーマンス、生産性(並行処理)に優れた言語として開発されました。
そのため、C言語やC++の文法と似ている、という特徴があります。
他にも、高い信頼性やパフォーマンス、並列処理への対応がRustを使用するメリットとなります。
Rustは、大規模テクノロジーリーダーである多くの企業が採用しています。例えば、AWSのLambdaとFargateのサーバレス機能やOracleのコンテナランタイムで採用されています。
他にも、Googleによって開発されているAndroidのBluetooth機能や、DropBoxのストレージ管理機能再構築などにRustが使用されています。
Rustのライブラリとは?
Rustライブラリはクレートと呼ばれる単位で管理され、様々な機能を提供します。
以下に一例を挙げます。
- ネットワーク通信
- データベースアクセス
- テスト
- ログ
- 暗号化
- 圧縮
- イメージ処理
ライブラリは、標準ライブラリとサードパーティー制の外部ライブラリ、二つの形態で提供されています。
RustライブラリはパッケージマネージャーであるCargoを使用して、簡単にインストールを行うことができます。
ライブラリは再利用可能なコードの塊であるため、特定の機能やタスクを実現することが可能です。
そのため、Rustを使用するプログラマーの多くは、標準ライブラリを使用します。
Rustの標準ライブラリ
Rustの標準ライブラリは、Rustのコア機能を提供しています。
そのため、他のプログラミング言語に入っている正規表現や乱数などがRustの標準ライブラリには入っていません。
Rustの標準ライブラリは以下の観点で作成されたためです。
- 標準ライブラリがなくとも依存関係を簡単に追加できる
- 後方互換を保ちながら大きな標準ライブラリを維持するのは難しい
他にも、Rustの標準ライブラリの特徴として、基本データ型を拡張するカスタム型(StringやOptionなど)を提供し、ネットワークやスレッドなどの機能はOSが提供していることを前提としています。
ここでは、代表的な標準ライブラリを紹介します。
string:拡張可能なUTF-8文字列型(String)
stringは、文字列を扱うデータ型になります。主にUFT-8エンコーディングされたUnicode文字列を扱うことが可能です。
stringでは以下の作業が可能です。一部紹介します。
- 文字列の結合
- 文字列の分割
- 文字列の検索
- 文字列の置換
また、他のデータ型との相互再鑑が容易であるため、異なるデータ型との変換も可能です。
slice:[T] に対する動的な参照
sliceは所有権のないデータ型となります。sliceは可変長のため、インデックスアクセスを提供するだけでなく、イテレーションもサポートしています。
sliceは、配列やベクター、文字列などのコレクションに含まれる要素のスライスを表現するために使用されます。所有権システムにより、スライスのライフタイムを厳密に管理することが可能です。
他にも、コレクション全体ではなく、一連の要素を参照することが可能です。
そのため、要素ポインタと、要素の数を含む情報を持っています。
また、多くの標準ライブラリの関数やメソッドでsliceは使用されています。例えば、sort、reverse、iterなどが挙げられます。
vec:ベクタ型(ヒープ上の動的配列:Vec<T>)
vecは、可変長のベクターを表すための配列データ型です。動的にサイズを変更することが可能で、同じ型の要素を含めることができます。
他にも、Rustの所有権システムを利用して、安全にメモリ管理を行うことが可能です。vecがメモリを必要とした時に、vecは自動的に必要なメモリを確保します。
また、vecはスライスを生成することも可能です。スライスは、&[T]という形式で表され、vecの要素を参照することができます。
boxed:ヒープメモリ型 (Box<T>)
boxedは、ヒープ型メモリとしてRustのヒープ割り当ての最も簡単な形式を提供します。boxedは、この割り当ての所有権を提供し、スコープ外になると内容を削除することができます。
collections:LinkedList,HashMap,BTreeSet などのコレクション型 (→ コレクション)
collectionsは、LinkedList、HashMap、BTreeSet などの一般的なデータ構造を効率的に実装する支援を行います。
例えば、配列やリスト、ハッシュマップ、セット、二分木マップなどのデータ構造が含まれています。
Rust のコレクションは、次の 4 つの主要なカテゴリに分類できます。
- シーケンス: Vec、VecDeque、LinkedList
- マップ: HashMap、BTreeMap
- セット: HashSet,BTreeSet
- その他:BinaryHeap
適したコレクションを選択するには、各コレクションの得意分野を理解する必要があります。公式による説明を参考にし、様々なコレクションの特徴やパフォーマンスを理解して使用してください。
fmt:文字列のフォーマット処理
fmtは、フォーマットされたテキスト出力を行うための機能を提供します。文字列や数値、デバッグ情報などのフォーマット処理が可能です。
そのため、fmtは、標準ライブラリの中でも頻繁に使用される関数になります。
iter:イテレータ処理 (→ イテレータ)
iterは、イテレータを実装するための機能を提供します。
主に、順番にアクセスしたり各要素へアクセスや繰り返し処理が可能です。
例えば、forループを使用するとコレクション内の各要素にアクセスが可能ですが、本関数を使用するとコレクションの内部構造にアクセスすることなく、コレクション内の要素にアクセスが可能になります。
そのため、よりシンプルで効率的なプログラムを実装できます。
time:時間計測
timeは、日時と時間に関する機能を提供します。システムの現在時刻や時間の範囲などを取得します。
また、DateTime、LocalDateTime、およびNaiveDateTimeなどの日時を扱う型を使用して、日時の操作やフォーマットを行うことができます。
mem:型のサイズやアライメントの取得やメモリの初期化などの管理
memは、メモリ操作に関する機能を提供します。
メモリのセットアップや初期化、整列、バイト単位の操作、および生ポインタ操作に関する様々な関数があります。
ただし、これらの関数は非常に危険で、誤った使い方をするとメモリ安全性を失うことがあるため、十分な注意が必要です。
fs: ファイルシステム管理
fsは、ローカルファイルシステムの内容を操作するための基本的な機能を提供します。ファイルやディレクトリの作成、コピー、削除、移動、ファイルの読み書きなどが可能です。
fsを使用すると、ファイルシステムに対する操作を簡単に行うことができます。
io: 入出力管理
ioは、入出力に関する機能を提供します。
例えば、バッファリング、非同期I/O、ファイル操作、圧縮/解凍、シリアル化/逆シリアル化、ストリーム処理などの機能を提供しています。
io内には、ファイルやネットワーク、標準入出力などのI/Oソースに対する読み書きを抽象化するトレイトと構造体があるためです。
ioの最も重要なトレイトは「Read」と「Write」です。これらのトレイトは、それぞれ読み取り可能なストリームと書き込み可能なストリームに対する標準化されたインターフェースを定義しています。これにより、さまざまなI/Oソースに対して、同じインターフェースでアクセスできるようになります。
また、バッファリング機能を提供する「BufReader」や「BufWriter」などのヘルパー構造体を利用することが可能です。
他にも、非同期I/Oをサポートするため、Futureと呼ばれる非同期プログラミングのコンセプトに基づいて構築されているという特徴があります。
net: TCP/UDP ネットワーク処理
netは、ネットワークプログラミングに必要な機能を提供します。
主に、TCP、UDP、UNIXドメインソケットなどの通信プロトコルを扱うための構造体やトレイトが含まれています。
一般的なネットワークプログラミングのために必要な、ネットワークアドレスの解決、ホスト名の取得やIPアドレスの操作などが可能です。
netを使用することで、高度なネットワークアプリケーションを作成することができます。
env: プロセッサ環境情報取得
envは、環境変数、プロセス引数、さまざまなディレクトリを操作するなどの関数を提供します。
そのため、envを使用すると、プログラムの環境変数やコマンドライン引数を簡単に操作することができます。
process: プロセス管理
processは、プロセスを操作するための機能を提供します。
プロセスの起動、停止、現在の情報を取得するための関数や新しいプロセスを生成するための構造体など、多数の関数と型が定義されています。
thread: スレッド管理
threadは、マルチスレッドを実装するためのスレッド管理機能です。主に、Rustにおけるマルチスレッドプログラミングの基礎となる重要な機能を提供しています。
例えば、Rustの型安全性を活かしたスレッド作成、スレッド間通信、同期機構、並行性をthreadで実行することができます。
sync: 非同期チャネル(スレッド間通信)
syncは、並列処理を行う非同期チャネル機能を提供します。
スレッドの同期や待機、スレッド間で共有するデータへのアクセス、所有権の提供などの機能があります。
syncを活用することで、高速で安全なマルチスレッドプログラムを実装が可能です。
Rustのライブラリの利用例
Rustには、前述したとおり、多くのライブラリが存在し、様々な用途に利用することができます。
ここでは、2つの具体的なライブラリの利用例を紹介します。
ファイル操作:Rustには、ファイルの読み書きやディレクトリの操作を行うためのstd::fsライブラリが含まれています。
ファイルの読み込みを行う場合、以下の手順で実行してください。
①std::fs::Fileを使用してファイルを開きます。
②std::io::Readトレイトを実装したオブジェクトを使用します。
③データを読み込みます。
use std::fs::File;
use std::io::prelude::*;
fn main() {
let mut file = File::open("data.txt").expect("Failed to open file");
let mut contents = String::new();
file.read_to_string(&mut contents)
.expect("Failed to read file");
println!("{}", contents);
}
ネットワーク通信:ネットワーク通信を行うためのstd::netライブラリが含まれています。
TCPソケットを使用してネットワーク上の他のサーバーと通信する場合、以下の手順で実行してください。
①std::net::TcpStreamを使用して接続します。
②std::io::Writeとstd::io::Readトレイトを実装したオブジェクトを使用します。
③データの送受信を行います。
use std::io::prelude::*;
use std::net::TcpStream;
fn main() {
let mut stream = TcpStream::connect("example.com:80")
.expect("Failed to connect to server");
stream.write_all(b"GET / HTTP/1.1\r\nHost: example.com\r\n\r\n")
.expect("Failed to send request");
let mut response = String::new();
stream.read_to_string
まとめ
Rustは、システムプログラミングのためのメモリ管理を安全に行うことができる、高性能なプログラミング言語です。
Rustのライブラリを利用することで、コードの再利用性が高まり、プログラム開発の効率を向上することができるため、ライブラリに関する理解を深めることが重要です。
ライブラリ自体はCargoパッケージマネージャーを使用して簡単にインストールすることができるため、実際に手を動かしてRustライブラリを学んでみましょう。
- CATEGORY
- 学習
- TAGS
この記事を書いた人

1992年生まれ、北海道出身。トレンドスポットとグルメ情報が大好きなフリーライター。 衣・食・住、暮らしに関する執筆をメインに活動している。 最近のマイブームは代々木上原のカフェ巡り。
この記事を監修した人

大学在学中、FinTech領域、恋愛系マッチングサービス運営会社でインターンを実施。その後、人材会社でのインターンを経て、 インターン先の人材会社にマーケティング、メディア事業の採用枠として新卒入社し、オウンドメディアの立ち上げ業務に携わる。独立後、 フリーランスとしてマーケティング、SEO、メディア運営業務を行っている。