[Rust]環境構築 + HelloWorldしてみた
はじめに
Rust初心者のツチノコです
最近CSやアルゴリズムについて興味がわき、
ついでだからRustを触りながら勉強してみよう!といういう思いで触りはじめました
間違ってるところや怪しい部分がありましたら、是非コメントいただけますと幸いです!
概要
- macOSにおけるRustの環境構築 & Hello World
- cargoを使ったプロジェクトの作成 & 実行
- その他気になったところの備忘録
環境構築
Macの場合、下記コマンドでRustをインストールすることが可能です
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
Homebrewをインストール済みの場合は、下記コマンドでもインストール可能です
# rustのインストール
brew install rust
上記コマンドを実行すると、 rustup コマンドも一緒にインストールされます
念の為最新安定版のRustをインストールします
// 最新安定版のRustをインストールする
rustup update stable
※command not foundになった場合
rustup update stable
zsh: command not found: rustup
- $HOME/.zshrcを編集してみる
. "$HOME/.cargo/env"
参考: rustup rust installation giving command not found error
- rustup-init をインストールする ← これで解決しました
# rustupインストールおよびrust環境のセットアップ
brew install rustup-init
rustup-init
# シェルの再起動
exec $SHELL -l
参考: macOSでRustのローカル開発環境を整えるための手順2022
- インストール完了後 rustup-init を試す
rustup-init
下記の通りエラーが出たため、「y」を入力しEnter
error: cannot install while Rust is installed
Continue? (y/N) y
続けて下記のメッセージが出たため、「1」を入力しEnter
Current installation options:
default host triple: x86_64-apple-darwin
default toolchain: stable (default)
profile: default
modify PATH variable: yes
1) Proceed with installation (default)
2) Customize installation
3) Cancel installation
>1
Rust is installed now. Great!
To get started you may need to restart your current shell.
This would reload your PATH environment variable to include
Cargo's bin directory ($HOME/.cargo/bin).
To configure your current shell, run:
source $HOME/.cargo/env
- 再度最新安定版のRustをインストールしてみる
rustup update stable
info: syncing channel updates for 'stable-x86_64-apple-darwin'
stable-x86_64-apple-darwin unchanged - rustc 1.62.0 (a8314ef7d 2022-06-27)
今度はいけました!
Rustのインストールがうまくいっていなかったみたいです、、
バージョン確認してみます
rustup --version
info: This is the version for the rustup toolchain manager, not the rustc compiler.
info: The currently active `rustc` version is `rustc 1.62.0 (a8314ef7d 2022-06-27)`
cargo --version
cargo 1.62.0 (a748cf5a3 2022-06-08)
VSCodeの拡張機能をインストールする
Rustの拡張機能をインストールしようとしたところ、
どうやら非推奨になってました
代わりに rust-analyzer をインストールします
Hello World
下記のサンプルファイルを作成し、
Hello Worldしてみます
fn main() {
println!("Hello World!!")
}
// hello.rsをコンパイル
rustc hello.rs
ls
hello hello.rs // helloという名前の実行ファイルが生成されている
// 実行ファイルから実行
./hello
Hello World!!
記念すべきRustの初実行!
正常に出力されました!
せっかくなので色々試してみます
関数を呼ぶ
fn hello() {
println!("Hello World!!")
}
fn main() {
hello()
}
変数を定義する
- 変数名はスネークケース
fn hello() {
let first_name = "錆田";
let last_name = "蟹男";
println!("Hello {} {}", first_name, last_name)
}
fn main() {
hello()
}
変数の再代入
純粋に let 変数名 で定義した場合は再代入ができない
fn hello() {
let first_name = "錆田";
let last_name = "蟹男";
first_name = "錆山";
println!("Hello {} {}", first_name, last_name)
}
fn main() {
hello()
}
first_name = "錆山";
^^^^^^^^^^^^^^^^^^^ cannot assign twice to immutable variable
↓
let mut 変数名で定義する
fn hello() {
let mut first_name = "錆田";
let last_name = "蟹男";
first_name = "錆山";
println!("Hello {} {}", first_name, last_name) //Hello 錆山 蟹男
}
fn main() {
hello()
}
文字列の結合
文字列リテラル(&str)は文字列のスライスのため、単純な結合はできない
fn hello() {
let mut first_name = "錆田";
let mut last_name = "蟹男";
first_name = "錆山";
last_name = last_name + "丸";
println!("Hello {} {}", first_name, last_name)
}
fn main() {
hello()
}
last_name = last_name + "丸";
| --------- ^ ---- &str
| | |
| | `+` cannot be used to concatenate two `&str` strings
| &str
↓
format! を使う
参考: Rustの文字列操作
fn hello() {
let mut first_name = "錆田";
let mut last_name = "蟹男";
first_name = "錆山";
println!("Hello {} {}", first_name, format!("{}{}", last_name, "丸"))
}
fn main() {
hello()
}
Hello 錆山 蟹男丸
Cargoプロジェクトを作成してみる
Cargoとは?
- Pythonの pip やNode.jsの npm みたいなものです
- パッケージマネージャとしての役割だけでなく、ビルドなどもしてくれます
Rustのビルドシステムであり、パッケージマネージャです。
コードのビルドやコードが依存しているライブラリのダウンロードや、それらのライブラリのビルドを行ってくれます。
参考: Cargoについて学ぶ
プロジェクトの作成
下記のコマンドより、Cargoプロジェクトを作成します
cargo new プロジェクト名
cd プロジェクト名
.
├── Cargo.toml
└── src
└── main.rs
上記に加え .git も作成されてました、便利!
src/main.rsの編集
for文で100万回ループさせた場合の実行時間を計測してみます
use std::thread::sleep;
use std::time::{Duration, Instant};
fn main() {
let now = Instant::now();
for _ in 0..1000000 {
println!("##########")
}
println!("{}", now.elapsed().as_secs());
}
比較対象としてPythonでも同じことをしてみます
import time
if __name__ == '__main__':
before_time = time.time()
for _ in range(1000000):
print('##########')
after_time = time.time()
print(after_time - before_time)
プロジェクトのビルド
下記コマンドでプロジェクトをビルドできます
cargo build
プロジェクトの実行
下記コマンドで実行してみます
cargo run
6
Pythonの場合
11.163349151611328
なんとざっくり2倍ほど差がありました!
Rustさんさすがの速さ、、
おわりに
「Rustは難しい」とよく聞くため、ビビりながら実行してましたが
なんとかHello Worldすることができ一安心です。。
ところどころ「おや?」と躓く部分がありましたが、
エラーメッセージが親切だったため、どこがいけないのかがわかりやすい印象でした!
またcargoについてもかなり便利そうだなと感じました!
参考
rustup rust installation giving command not found error
macOSでRustのローカル開発環境を整えるための手順2022
Rustと関数実装
Rust ツアー
Rustの文字列操作
Cargoについて学ぶ
Struct std::time::Instant
Discussion