文字列型はなんと6種類もある。
成果物
文字列
文字列型は2種類に大別できる。Rust内部で文字はUTF-8で扱う。
型 | メモリ確保領域 | (可不)変 |
---|---|---|
str | スタック | 不(固定長 immutable) |
String | ヒープ | 可(可変長 mutable) |
文字列型
内部表現
String
はVec<u8>
のラッパ。String.len()
で得られるのはバイト数である。文字数ではない。StringはUTF-8のバイト配列となる。
観点
使い方
生成
let s = String::new(); let s = "init".to_string(); let s = String::from("init");
追記
let mut s = String::new(); s.push('A'); s.push_str("BC");
mut
なString
であるべき。
結合
+
演算子format!
マクロ
+
演算子
let s1 = String::from("Hello, "); let s2 = String::from("world!"); let s3 = s1 + &s2;
s1
の所有権がムーブされる(以降、使えない)
理由は以下参照。一言でいうと、s1
の所有権は+
演算子の実体fn add(self, s: &str) -> String {
のself
にムーブする。
また、直感的でない表記である。
- 第一引数は
&
がなく、以降は&
が必要
上記2点から、+
演算子による結合は使いにくい。
format!
マクロ
let s1 = String::from("A"); let s2 = String::from("B"); let s3 = String::from("C"); let s = format!("{}-{}-{}", s1, s2, s3);
所有権を奪わない。冗長だが、これが最善か。
走査
文字(char)
let hello = "Здравствуйте"; for c in hello.chars() { println!("{}", c); }
バイト
// str.bytes()を使えばバイト単位(u8型)で走査できる let hello = "Здравствуйте"; for c in hello.bytes() { println!("{}", c); }
対象環境
- Raspbierry pi 3 Model B+
- Raspbian stretch 9.0 2018-11-13
- bash 4.4.12(1)-release
$ uname -a Linux raspberrypi 4.19.42-v7+ #1219 SMP Tue May 14 21:20:58 BST 2019 armv7l GNU/Linux
前回まで
- Rustを学んでみたい(プログラミング言語)
- Rustの環境構築
- RustでHelloWorld
- Rustの和訳ドキュメント
- Cargoでプロジェクト作成・ビルド・実行
- クレートとは?
- Rustで関数を使ってみる
- Rustでモジュールを使ってみる
- Rustで乱数を生成する(rand)
- Rustで標準入力する(std::io::stdin().read_line())
- RustでMatch判定する(match)
- Rustでprintとread_lineを1行にする方法
- Rustで数当てゲーム
- クレート名にドット.が使えない
- Rustの変数と可変性(let, mut) error[E0384]: cannot assign twice to immutable variable
x
- Rustのimmutable束縛とconst定数の違い
- RustのREPL、evcxrのインストールに失敗した
- Rustでコンパイルするときの変数未使用warningを消す
- Rustの変数(再代入、再宣言(シャドーイング))
- Rustのシャドーイングについて
- イミュータブルについて(副作用)
- Rustの定数(const)
- Rustのデータ型(数値)
- Rustのデータ型(論理)
- Rustのデータ型(文字)
- Rustのデータ型(タプル)
- Rustのデータ型(配列)
- Rustの関数
- Rustのif式
- Rustのくりかえし文(loop)
- Rustのくりかえし文(while)
- Rustのくりかえし文(for)
- Rustの所有権(ムーブ)
- Rustの所有権(関数)
- Rustの所有権(スライス)
- Rustの構造体(定義とインスタンス化)
- Rustの構造体(プログラム例)
- Rustの構造体(メソッド)
- Rustの列挙型(enum)
- Rustの列挙型(enum)
- Rustの列挙型(enum)
- Rustのmatch(制御フロー演算子)
- RustでNULLを扱う(Option, Some, None)
- NULL参照は10億ドルの失敗だった
- Rustの列挙型に独自表示を実装する(E0277 対策 std::fmt::Display 実装)
- RustのIfLet(matchの糖衣構文)
- Rustのプロジェクト構造
- Rustのcargoでライブラリ&テスト(単体、結合)
- Rustのモジュール(mod)
- Rustのモジュール(pub)
- Rustのmod参照方法(
mod 子モジュール名;
,use 要素名;
,extern crate クレート名;
,super
) - Rustのインポートまとめ(Rust2018)
- RustのコレクションVec型