nikkie-ftnextの日記

イベントレポートや読書メモを発信

『Rustの練習帳』1章 Rustのプロジェクトの導入が一歩一歩進んで心地よい

はじめに

今日はMM初フルコンボ記念日😆 nikkieです。

『Rustの練習帳』、はじめました。
鹿児島への道中読んでいて、このたび写経に着手です。

目次

『Rustの練習帳』

副題は「コマンドラインツールの作成を通してRustを学ぶ

私はPythonを愛してやみません。
特にコマンドラインツールを数々書いてきました。
好きな標準モジュール(の1つ)はargparseで、このブログにいくつも記事があります1
なので「コマンドラインツールの作成を通して」というのは私にはしっくりきます。

著者はRustとLinuxコマンドについて豊富な知識を持っているようです2
そこからの逆算もあると思うのですが、この本は一歩一歩進みます。
その一例としてプロジェクトの導入を取り上げます。

前提:nikkieのRustのレベル感

もう全然わかんないよ!!
所有権って何!?

完全に理解した感がまったくありません \(^o^)/オワタ

そんな状態でも過去独力で作ったのがこちら。
所有権を理解できていないですが、日付計算はできました

Pythonの開発環境でRustの存在感が増しており(Ryeやuv)、これらのコマンドの実装を読んでいたという特殊な境遇にあります。
Rustをもっと読めるように、さらには書けるように、なりたい...!

Rustのプロジェクト

書籍ではプロジェクトですが、Cargoのドキュメントからパッケージと同義語と理解しました。
https://doc.rust-lang.org/cargo/appendix/glossary.html#project

Another name for a package.

ここで書いているのは要はcargo newのことなのですが、

Rust初学者の目線からすると、ここに至るまでの導入がうまかったと感じています。
初手cargo newはこれまでにも出会ってきましたが、『Rustの練習帳』は小さいステップを重ねて進んでいきました。

3段階でプロジェクト導入

1. どこでもいいからhello.rsを作る

『Rustの練習帳』がまずやったのは、hello.rsを作ることでした。
なお、開発環境の構築はまえがきで案内されています。

% rustc --version
rustc 1.78.0 (9b00956e5 2024-04-29)
% cat hello.rs 
fn main() {
    println!("Hello, world!");
}
% rustc hello.rs
% ./hello 
Hello, world!

「Hello, World!」と出力する関数を書き、実行ファイル(バイナリ)にコンパイル
実行できました。

Rustのプログラムを動かせちゃったぜ〜✌️🐑

この流れは、Pythonチュートリアルを思い起こさせます。
スクリプト(例:fizzbuzz.py)を書いて、インタプリタpython)で実行!
https://pycamp.pycon.jp/textbook/2_intro.html#fizzbuzz

2. srcディレクトリを導入

一度Rustのプログラムを動かした後で、ディレクトリ構成が導入されます

.
├── hello
└── src
    └── hello.rs
% mkdir src
% mv hello.rs src/
% rustc src/hello.rs
$ ./hello
Hello, world!

すでに動いているプログラムがあるので、ディレクトリに配置するだけで済みました。
なるほど、srcの下に置くんですね〜

ちなみにPythonディレクトリ配置が 自 由 です。
src-layoutとflat-layoutのように呼ばれ3OSSのライブラリでは前者が多くなったそうです。

3. cargo new

Cargoを使うとより簡単だよ」と案内されます。

ディレクトリを一度削除してからcargo new hello
以下のように生成されました。

.  # helloディレクトリ(cdしてきた)
├── Cargo.toml
└── src
    └── main.rs
% cat src/main.rs 
fn main() {
    println!("Hello, world!");
}

そして、cargo runを使えばrustcを叩かなくてよくなると教わりました。

% cargo run --quiet
Hello, world!

終わりに

めちゃめちゃ小さな点ですが、『Rustの練習帳』がcargo newまで一歩一歩導入していて初学者視点ではよかったと書いてきました。
言語の導入って初めて知ること一度にたくさんドーン!でおまじないが残っちゃうケースもあると思うんですが、練習帳の導入は一通り理解できた感があってよかったです。
cargoコマンドが便利なことも体験したので、使い倒していくぞ!

写経の状態

ここまで経験して、Ryeがsrc-layoutを強制する背景は見えた気がします4
RustのCargoではそれが唯一絶対のルールですから。


  1. コマンドラインツールカテゴリをどうぞ!
  2. Pythonについて私から補完しておきました
  3. pytestのドキュメントなどで見かけます https://docs.pytest.org/en/stable/explanation/goodpractices.html#choosing-an-import-mode
  4. なお私としては、ある言語に対して他の言語の文化を絶対のものとして持ち込むのは受け容れがたいです。その言語を使いこなすために、「郷に入っては郷に従え」が有効だと思うので(このトピックはどこかで記事を書くかも)