文字列リテラルは”~”で囲む
r”~”で囲んだ文字列をRaw文字列リテラルという
let msg:&str = r”Hello Dogs”;
b”~”で囲んだ文字列も[u8]のバイト列
let msg = b”Hello”;
fn main(){ let msg:&str = r"Hello¥nDogs"; println!("msg={}", msg); }
エスケープシーケンス
¥b バックスペース
¥f フォームフィード
¥n 改行(line feed, newline)
¥r キャリッジリターン
¥t 水平タブ
¥v 垂直タブ
¥¥ バックスラッシュ
¥’ 単一引用符’
¥” 二重引用符”
¥xhh 2つの16進数
¥uhhhh 4つの16進数
¥Uhhhhhhhh 8つの16進数
¥ooo
水平タブ
fn main(){ println!("12\tdef"); println!("256\tmemory"); println!("1024\tkiro"); }
### タプルと配列
タプルは複数の異なる型の値を1つのグループにすることができる複合型
配列は同じ型の要素を並べたもの
type: キーワードのtypeを使って型の別名(エイリアス)を定義することができる 別名の先頭は大文字にする。例えばu64にPopという別名を付けることができる
fn main(){ type Pop = u64; let jp_pop: Pop = 123_456_789; let es_pop: Pop = 46_723_749; let total = jp_pop + es_pop + 456789_u64; println!("total={}", total); }
### 変数と定数
不変の変数: let x = 10;
コンパイラが推測して決定することは型推論という
let zero: i64 = 0;
可変の変数を宣言するときはlet mutを使用する
fn main(){ let mut x = 123; println!("x={}", x); x = 64; println!("x={}", x); }
fn main(){ let mut x = 123; println!("x={}", x); x = 23; println!("x={}", x); let x = "こんにちは"; println!("x={}", x); }
定数とはプログラムの実行中に内容が変わらない値に名前を付けたもの
const MAX_DATA: u32 = 100;
const HELL:&str = “Hello, Dogs”;
Rustには所有権という概念がある。これは変数は値を所有するという概念
fn main(){ let s1 = String::from("hello Rust"); let s2 = s1.clone(); println!("s1={}, s2={}", s1, s2); }
有効範囲
関数の中で宣言した定数や{~}の中で宣言した定数はその中で有効
fn main(){ let x = 3; { let x = 12; println!("x={}", x); } let y = x * 2; println!("x={}", x); println!("y={}", y); }
static変数は、モジュールのどこからでも参照できる変数
static mul VAL: i32 = 123;
static mut VAL: i32 = 123; fn main(){ unsafe { println!("VAL={}", VAL); } twice(); unsafe { println!("VAL={}", VAL); } } fn twice(){ unsafe { VAL = VAL * 2; println!("VAL in twice()={}", VAL); } }