⚙️

[Rust]環境構築 + HelloWorldしてみた

2022/07/08に公開約6,800字

はじめに

Rust初心者のツチノコです
最近CSやアルゴリズムについて興味がわき、
ついでだからRustを触りながら勉強してみよう!といういう思いで触りはじめました
間違ってるところや怪しい部分がありましたら、是非コメントいただけますと幸いです!

概要

  • macOSにおけるRustの環境構築 & Hello World
  • cargoを使ったプロジェクトの作成 & 実行
  • その他気になったところの備忘録

https://www.rust-lang.org/ja

環境構築

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を編集してみる
.zshrc
. "$HOME/.cargo/env"
実行結果
no such file or directory: /Users/xxxx/.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してみます

hello.rs
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万回ループさせた場合の実行時間を計測してみます

src/main.rs
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

ログインするとコメントできます