Rustの学習を進めていると、型についてちゃんと理解しておかないとダメだと気が付きました。
ていうか、普通これが最初だろ!
というツッコミがたくさん聞こえて来るので(心の声も含めて)、今回はRustの型について学習を進めたいと思います。
Rustの型について
以下の基本型があるようです。
- 整数型
- 浮動小数点型
- 文字列型
- 関数型
- bool型
1. 整数型
int
let num:i8 = 8;
8ビット整数型の定義です。
構文は、次のような意味を含んでいます。
let : 変数定義
num : 変数名
i8 : int 8bitの意味
=8 : 値を代入
8ビット以外にも、
num:i16
num:i32
のように、ビット数を変えて書くことで定義することが可能です。
unsigned
また、符号なし整数型は次のように書きます。
let num:u8 = 8;
intが、unsignedの頭文字になります。
最大値と最小値
max_min.rs
fn main(){
let max_val = i8::max_value();
let min_val = i8::min_value();
println!("{} , {}", max_val, min_val);
}
実行
$ rustc max_min.rs
$ ./max_min
> 127 , -128
ビット数に応じて、最大値と最小値を取得することができます。
isize , usize
iやらuやらのそれぞれのビット数というのは、一体何なのかというと、使っているパソコンのビット数を使うというのが一般的です。
32bitパソコンであれば、i32やu32、64bitパソコンであれな、i64やu64という感じです。
そのサイズより下のビット数を使っていれば問題はありませんが、許容を超えるビット数を使うとエラーになるので、この点を意識して使いましょう。
Rustでのデフォルト整数ビット数は、32ビットのようなので、ビット指定をしない場合は、i32でセットされるようですね。
2. 浮動小数点型
何かとエラーの元になりがちな浮動小数の扱いはRustでもできます。
整数型と同じように、次のように書くことで浮動小数点型の定義ができます。
let num: f32 = 10.1;
f32の他に、f64もちゃんと用意されていて、それぞれのmin-max値は以下のようになっています。
f32 : -3.4028235e38 ~ 3.4028235e38
f64 : -1.7976931348623157e308 ~ 1.7976931348623157e308
エラー注意
floatの値に整数値をセットすると、コンパイルエラーがでます。
float.rs
fn main(){
let num1:f32 = 1.001;
let num2:f32 = 1;
println!("{} , {}", num1, num2);
}
実行
$ rustc float.rs
error[E0308]: mismatched types
--> float.rs:3:18
|
3 | let num2:f32 = 1;
| --- ^
| | |
| | expected `f32`, found integer
| | help: use a float literal: `1.0`
| expected due to this
error: aborting due to 1 previous error
For more information about this error, try `rustc --explain E0308`.
整数型、少数型をちゃんと切り分けてプログラミングしましょうね。
3. 文字列型
Rust言語の文字列型は、
String と
&str の2種類があります。
String
有効なUTF-8の配列であることを保証されたバイトのベクタ(Vec<u8>)として保持されます。
ヒープ上に保持され、伸長可能で、末端にnull文字を含みません。
&str
有効なUTF-8の配列のスライス(&[u8])で、いつでもStringに変換することができます。
&[T]がいつでもVec<T>に変換できるのと同様です。
&strはプリミティブ型で、Stringのリテラルになります。
サンプルコード
コピペしただけなので、わかりにくい文章になっていますが、自分が理解したのは、
Stringを使ったほうがいいかもよという事です。
ポインタなどが理解できてから、&strを使うのがいいでしょう。
str.rs
fn main(){
let s1 = "str-1";
let s2: &'static str = "str-2";
let s3: String = String::from("str-3");
let s4: &str = &s1[0..2];
println!("{}, {}, {}, {}" , s1, s2,s3,s4);
}
実行
$ rustc str.rs
$ ./str
> str-1, str-2, str-3, st
&strで文字列を取り出しているサンプルは、配列番号っぽい箇所の数値がつまづきポイントなので、自分で数値を変えて内容を理解しておきましょう。
4. 関数型
Rustの関数は、fnで定義できます。
これまで何度も書いてきましたね。
c言語などと同じ様に、main関数が必ず必要で、必要に応じて他の関数を増やすことができます。
fn main(){
println!("{},{},{}", str(), int(), float());
}
fn str() -> String{
return "Test value.".to_string();
}
fn int() -> i32{
return 1;
}
fn float() -> f32{
return 2.01;
}
main以外のfunctionを定義して、それぞれの返り値を取得する書き方を簡単に書いてみました。
i32やf32の他に文字列の場合は、to_string()で文字列変換して、Stringで返す定義をする必要があります。
どれかを怠ると、コンパイルエラーになるので、注意。
5. bool型
ほとんどのプログラミング言語の共通しようで、bool型(ブーリアン型)は、
trueとfalseを、1と0として扱い、◯か☓かを判定する判定値として扱われます。
if文などの条件分岐の条件文の箇所がブーリアンとして考えるとわかりやすいですね。
bool.rs
fn main(){
let bool1 = true;
let bool2 = false;
println!("{}, {}", bool1, bool2);
}
実行
$ rustc bool.rs
$ ./bool
> true, false
さほど気を使う部分もないので、概念として覚えておくのがいいでしょう。
参考
Rust入門「データ型」
[Rust] isize、usizeとは
【Rust】整数型、浮動小数点型
Rust By Example 日本語版「文字列」
Rustの文字列を理解する
0 件のコメント:
コメントを投稿