この記事はRustを触り始めて2日目の初心者が書いています。こう書いた方がわかりやすい、ここが間違っているなどご指摘あればお願いします。
Rustはコンパイル言語
Rustはコンパイルを行ってから実行する
# コンパイル
$ rustc hello.rs
# 実行 これはhello.rsというファイルの実行
$ ./hello
hello, world!
画面出力にチャレンジ
Rustでの画面出力
$ println!("ここに出力内容を書き込む")
ここでの「!」は、普通の関数ではなく、マクロとして定義されてるという意味。
⇒マクロを使うのは、Rustの静的型付き言語という特性と所有権システムが関係している。
⇒マクロを利用することでデータ型を手軽に画面出力できる。
⇒この画面出力をマクロなしでやろうとすると、膨大なプログラムを書かないといけない。
マクロを使って画面出力を行うことで、少ないコードで記述することが可能になる。
数字を埋め込んだ画面出力
println!では、第一引数に文字列、第二引数に値を指定して出力を行う。
⇒代入したい部分に{}を入れる。
let 変数名 = 値; # 値を変数に束縛する
println!("…文字列…{}…, 代入したい値"); # 値を書式に入れ込み画面出力
fn main() {
let ken_age = 20;
println!("ケンの年齢は{}歳です", ken_age);
}
>>>ケンの年齢は20歳です
四則演算にチャレンジ
fn main(){
let pen = 100;
let eraser = 50;
let count = 3;
println!("ペンと消しゴムを1つずつ買った合計は{}円", pen + eraser);
println!("ペンを3本買った合計は{}円", pen * count);
}
>>>
ペンと消しゴムを1つずつ買った合計は150円
ペンを3本買った合計は300円
⇒上記のコードは整数の計算をしている。
⇒150.0のように、すると実数型となる。
⇒Rustは、型に厳しい言語なので、整数と実数を明確に区別する必要がある。
Rustの基本文法について覚え書き
- Rustはmain関数から実行される
⇒Rustはmain関数から実行され、関数を定義するときは「fn」を使う。
// ここから実行
fn main() {
ptintln!("hello World!")
}
- コメントが「//」から始まる
// 1行コメント
/*
複数行でも
コメントが
書ける
*/
- 繰り返しfor文
/*
for 変数 in 開始..終了値+1 {
繰り返す処理文
}
*/
// 10から100まで出力する処理
fn main() {
for i in 10..101 {
println!("{}", i)
}
}
- 条件分岐if文
/*
if 条件1 {
条件1がTrueのときの処理
}
else if 条件2 {
条件2がだったときの処理
else {
すべての条件文がFalseだったときの処理
}
*/
fn main() {
let count = 100;
if count % 3 == 0 {
println!("3で割り切れる");
} else if count % 2 == 0 {
println!("2で割り切れる");
} else {
println!("3でも2でも割り切れない")
}
}
- 文末には「;」を付け、いらない丸括弧をつけると警告が出る
fn main() {
let a = "hello";
if (a == "hello") {
println!("こんにちわ")
}
}
$ rustc exam3.rs
>>>
warning: unnecessary parentheses around `if` condition
--> hello.rs:3:8
|
3 | if (a == "hello") {
| ^ ^
|
= note: `#[warn(unused_parens)]` on by default
help: remove these parentheses
|
3 - if (a == "hello") {
3 + if a == "hello" {
|
warning: 1 warning emitted
// 警告は出るが実行はできる。つけない方がいいかも
$ ./exam3
>>>こんにちわ
Rustの変数定義について
Rustでは、変数を「let 変数名 = 値; 」というように宣言する。変数の値は、変更ができないイミューダブルな変数となる。このように定義した後、コンパイルを行うとエラーが発生してしまう。
⇒不用意に変数の値を書き換えてしまうとバグやエラーの原因にもつながってしまう。
⇒このような仕様にすることで、意図しない変更を防止できるので、保守性向上にもつながる。
書き換え可能な変数を定義するには、
let mut 変数名 = 値;
というように定義する。
⇒mutは、「mutable」の意。
fn main() {
let x = 10;
x = x + 1;
println!("{}", x)
}
$ rustc exam.py
>>>
2 | let x = 10;
| -
| |
| first assignment to `x`
| help: consider making this binding mutable: `mut x`
3 | x = x + 1;
| ^^^^^^^^^ cannot assign twice to immutable variable
error: aborting due to previous error
For more information about this error, try `rustc --explain E0384`.
Rustの変数の型について
Rustは静的型付け言語である。⇒したがって、変数の型を指定しないといけない。
これまでは、変数の型宣言を行っていないのはなぜか?
⇒それは、Rustには、型推論という機能を持っているからである。
しかし、関数を定義したり、新しいデータ型を使う場合には、型を指定しないといけない
⇒Rustで型推論が有効になるのは、main関数の内側だけだからである。
⇒Rustでは、大きく分けて「符号あり整数」「符号なし整数」「浮動小数点数」の3つの数値型が存在する。
Rustで変数の型を指定したいときは
let 変数名: データ型 = 値
というようにしてをする。
参照
Rustの数値型をマスターしたい(Part1)
利用可能な数値範囲を出力することができる。
⇒最大値を「型::MAX」、最小値を「型::MIN」という風に表せる。
fn main() {
println!("符号あり整数");
println!("i8={}から{}", i8::MIN, i8::MAX);
println!("i16={}から{}", i16::MIN, i16::MAX);
println!("i32={}から{}", i32::MIN, i32::MAX);
println!("i64={}から{}", i64::MIN, i64::MAX);
println!("符号なし整数");
println!("u8={}から{}", u8::MIN, u8::MAX);
println!("u16{}から{}", u16::MIN, u16::MAX);
println!("u32={}から{}", u32::MIN, u32::MAX);
println!("u64={}から{}", u64::MIN, u64::MAX);
println!("浮動小数点");
println!("isize={}から{}", isize::MIN, isize::MAX);
println!("usize={}から{}", usize::MIN, usize::MAX);
println!("usize=u{}", usize::BITS);
}
>>>
符号あり整数
i8=-128から127
i16=-32768から32767
i32=-2147483648から2147483647
i64=-9223372036854775808から9223372036854775807
符号なし整数
u8=0から255
u160から65535
u32=0から4294967295
u64=0から18446744073709551615
浮動小数点
isize=-9223372036854775808から9223372036854775807
usize=0から18446744073709551615
usize=u64
Rustは文字と文字列を区別する?
Rustでは「文字」と「文字列」を区別する。
⇒'X' とすると文字となり、"X"とすると文字列となる。
つまり、シングルクォーテーションは、文字、ダブルクォーテーションは文字列に使う。
また、Rustでは、「as」を用いて強制的な型変換を行うことが可能である。
// asで強制型変換
let 変数名 = 変数 as 型;
関数の定義について
fn 関数名(引数宣言)-> 戻り値 {
関数の内容を記述
}
関数を宣言するときは、引数や戻り値のデータ型を明記しなくてはならない。
fn add(x: i64, y: i64) -> i64 {
x + y
}
fn main() {
let a_b = add(15, 30);
println!("15+30={}", a_b)
}
Rustでは、関数の値を返す方法が2つあります。
⇒値
⇒return 値;
上記のコード(add関数)の例では、「値」のみを記述して関数から値を返している。
これをreturn 値;のようにも記述できる。
ここでの違いは、「;」セミコロンの有無に注目。returnを使うとreturn文となるので、「;」が必要になる。
クロージャーを使ってみる
Rustの「クロージャ」とは、Pythonでいう「ラムダ関数のこと」である。
let 名前 = |引数| 定義;
例で、クロージャを記述してみる。
fn main() {
// クロージャ
let x = |a| a+100;
println!("{}", x(10));
}
>>>110
Rustで配列を用意する
// 配列要素数の配列を初期値で初期化する
let mut 配列名 = [初期値; 配列要素数];
// 配列に値を代入
配列名[要素番号] = 値;
// 要素の取得
let 変数 = 配列名[要素番号];
fn main() {
let mut a = [0; 10];
a[0] = 999;
let x = a[0];
println!("{}", x)
}
>>>999
参考図書
手を動かして考えればよく分かる 高効率言語 Rustの書き方