Rust勉強備忘録Part1
RustのEcosystemについて
rustc
Rustのコンパイラcargo
Rustの依存関係マネージャーとbuildtoolrustup
Rustツールチェーンとインストーラーとアップデーター
`rustc`および`cargo`のインストールと更新
また複数バージョンをインストールして切り替えすることもできる
そもそもRustとは
Rustは新しい言語として、2015年に1.0バージョンがリリースされた
Rustは静的にコンパイルされた言語で、C++と同様の役割を果たす
Rustは多くのプラットフォームとアーキテクチャをサポートしている
そして、Rustは幅広いデバイスで使われている
Rustの世界
関数はfnで定義する
CやC++のように中括弧でスコープが区切られる
main関数はプログラムのエントリーポイント
Rustの文字列はUTF-8でエンコードされ、任意のUnicode文字も含めることができる
Rustのユニークな特徴
コンパイル時のメモリ安全性
未定義の実行動作がないこと
モダン言語機能
コンパイル時の保証
初期化されていない変数がないこと
ほとんどの場合メモリリークがないこと
技術的にはRustでもメモリリークさせることは可能。
ただこれは故意的におこない限り発生はし得ない。
そのため、Rustの「メモリリークが発生しない」は「偶然のメモリリークがほとんどない」という意味で理解するのが良い。二重開放がないこと(freeの2度目以降呼び出しができないこと)
開放後は使用できないこと
NULLポインタがないこと
Mutexの解除忘れがないこと
スレッド間のデータ競合ないこと
interiorの無効化が行われないこと
Rustの混ぜ合わせたType定義
let mut a: [i8; 10] = [42; 10];
↑はi8型で配列の要素数10個入れられるArray型に42という数値ですべての要素(10個)を初期化していることになるlet t: (i8; bool) = (7, true);
これはindex0にi8型、index1にbool型が入るtuplesを定義していることになる
Rustはダングリングポインタを禁止している
そもそもダングリングポインタとは
ダングリングポインタとは、無効なメモリ領域を指すポインタ。
すでに開放されているポインタを参照し続けているポインタのことをいう。
例えば、寿命を迎えたオブジェクトを参照し続けているポインタもダングリングポインタになる。
Rustでは
Rustではそれを禁止しており、例えば無効になったスコープ内からスコープ外に参照を渡して、その参照をスコープ外から使用するとエラーが発生する。
Rustの2つのstring型について
&str
文字列スライスへの不変な参照
String
変動可能な文字列バッファ
Rustは型に対して関数を定義することができる(kotlinでいう拡張関数てきな?)
struct hogehoge
というように型を定義したときに
impl hogehoge
と型と同名のimplスコープを定義して、その中に、
fun hoge() { … }
として関数を定義すると、
hogehoge.hoge()
というように使用することができるようになる
Rustでは関数のオーバーロードが禁止
Rustでは関数のオーバーロードが禁止されているため、1つの関数で1つの実装しかもつことが許されていない
また、デフォルト値の設定もサポートされていない(代替はマクロを使うとか)
その代わり、ジェネリックが使えるため、それで複数型の関数を作ることはできる
Rustでの暗黙的キャストについて
Rustでは自動的に暗黙的キャストを行わない
そのため、例えばi16型を要求しているところに対し、i8型を入れると同じintegerなので、C言語では暗黙的キャストが行われそのまま実行できるが、Rustではエラーが発生する。
これを回避する方法として、integer型にはFrom<T> and Into<T>が実装されており、これを使用することで、他の方からキャストさせることができる。
上記の例の場合、i16::from({i8型で定義した数値})とすることでi16型にキャストすることができる
これをもっと簡単にする方法としては、{i8型で定義した数値}.into()とすることで自動的に必要となる型へキャストしてくれる
参考
この記事が気に入ったらサポートをしてみませんか?