Hagakun blog
hero image[object Object]

【Chapter3】クジラ飛行机さんの Rust 本を読んで Rust を勉強する


文字列操作

&str はスライス、String はベクター

rust
fn main() {
// &str はスライス。 String はベクターなので注意が必要。
// let s: &str = "hello world";
let s: &str = "こんにちは世界";
// println!("{}", s.[0]); // rustの文字はUTF-8で、日本語は3バイト以上のため文字の一部しか取り出せずエラーとなる。
for i in s.chars() {
println!("{}", i);
}
// ちなみにchars()はIterator, nth()はOption型を返すためunwrap()等を使って値を取り出す。
println!("{}", s.chars().nth(0).unwrap()); // こ
// chars()ではなくbytes()を使うとバイト列を返すこともできる
println!("{}", s.bytes().nth(0).unwrap()); // 227
// s[n]を使うとエラーとなるが、&s[0..1]のようにスライスとして取得すれば取り出せるが、
// 数値はバイト数を表しており、文字数を表しているワケではない点に注意
// スライスのスライス
println!("{}", &s[0..6]); // こん
}

エンコード

encoding_rs クレートを使うと簡単に shift_jis へのエンコード/デコードが可能。

rust
use encoding_rs;
use std::fs;
use std::fs::File;
use std::io::Write;
fn main() {
let file_name = "./shiftJis.txt";
let text = "ファイアーエムブレム";
save_jis(file_name, text);
load_jis(file_name);
}
fn save_jis(name: &str, text: &str) {
let (enc, _, _) = encoding_rs::SHIFT_JIS.encode(text);
let buf = enc.into_owned();
let mut file = File::create(name).expect("作成");
file.write(&buf).expect("書き込み");
// file.write_all(&buf).expect("書き込み");
}
fn load_jis(file_name: &str) -> String {
let buf = fs::read(file_name).expect("読み込み");
let (dec, _, _) = encoding_rs::SHIFT_JIS.decode(&buf);
dec.into_owned()
}

グローバル変数の利用方法

Rust では原則、グローバル変数を使うことはできないが、 unsafe を使うことでこれを回避することができる。

rust
//グローバル変数の定義
static mut SEED: isize = 1;
fn main() {
// unsafe ブロック内でのみ利用可能
unsafe {
SEED = 1;
println!("{}", SEED);
}
// println!("{}", SEED); // エラー
}

アトリビュート

Rust のコンパイラに対して、 #[derive(Debug)] のように記載すると構造体や列挙型などの振る舞いを追加することができる
Qiita の詳しい記事はこちら

rust
fn main() {
#[derive(Debug)]
struct Items {
name: String,
value: isize,
}
let item = Items {
name: "Sword".to_string(),
value: 100,
};
println!("{:?}", item); // Debugがついていないと printできない。
}