日記(日記とは言っていない)

https://zenn.dev/23prime に移行しました。

<Rust 備忘録> 文字列

Rust における文字列の処理に関するメモです.

文字列型

2つの文字列型がある.

  • &str : 固定長.文字列スライスっていうらしい.
  • String : 可変長.to_string() によって &str から変換できる.逆に,& によって &str に変換できる.

&str 型と String 型はそれぞれ,内部的には &[u8]Vec<u8> であり,つまり前者はスライスで,後者はベクタ.
結論を言うと String 型はスライスをベクタに変換したりして高コストなので,特別文字列の変更をしたいとき以外は,なるべく &str を使った方がいいかもしれない.

index によるアクセス

let s = "hello";

let t = &s[0..5];
assert_eq!(t, "hello");

let cs: Vec<char> = s.chars().collect(); // Char の Vec にバラす
assert_eq!(Vec::len(&cs), 5);
assert_eq!(cs[0], 'h');

日本語だと次のような感じ.

let mut s = "ハロー!";

let t = &s[0..12]; // Byte で当たるので注意
assert_eq!(t, "ハロー!");

let cs: Vec<char> = s.chars().collect();
assert_eq!(Vec::len(&cs), 4);
assert_eq!(cs[0], 'ハ');

文字列の連結

  • push(&mut self, ch: char): Char を後方に連結.
  • push_str(&mut self, string: &str): &str を後方に連結.
  • +: push_str とほぼ同じ.
  • concat(): Vec<&str> の要素を連結する.
  • connect(s: &str): Vec<&str> の要素に s を挟んで連結する.

が使える.

let mut h = "hello,".to_string();
let s = " ";
let w = "world!";
assert_eq!(h + s + w, "hello, world!");
let mut ss: Vec<&str> = vec!["hello,", " ", "world!"];
let s = ss.concat();
assert_eq!(s, "hello, world!");
let mut ss: Vec<&str> = vec!["hello,", "world!"];
let s = ss.connect(" ");
assert_eq!(s, "hello, world!");

文字列の分割

  • split: Char で分割.
  • split_str: &str で分割.
let mut s = "a b c d e";
let ss: Vec<&str> = s.split(' ').collect();
assert_eq!(ss, vec!["a", "b", "c", "d", "e"]);

文字列の長さ(つまり文字数)とキャパシティ

  • len(&self) -> usize
  • capacity(&self) -> usize
let mut h = "hello,".to_string();
let s = ' ';
let w = "world!";

let mut len = h.len();
let mut cap = h.capacity();
assert_eq!(len, 6);
assert_eq!(cap, 6);

h.push(s);
assert_eq!(h, "hello, ");
let mut len = h.len();
let mut cap = h.capacity();
assert_eq!(len, 7);
assert_eq!(cap, 12);

h += w;
assert_eq!(h, "hello, world!");
let mut len = h.len();
let mut cap = h.capacity();
assert_eq!(len, 13);
assert_eq!(cap, 24);

文字列の置換

  • replace(s0, s1): s0s1 へ置換.
let s = "hello, world!";
let r = s.replace("world", "hello");
assert_eq!(s, "hello,      world!");
assert_eq!(r, "hello, hello!");

型キャスト

  • parse: &str を別の型へとキャストする.
let s: i64 = "123".parse().unwrap();
assert_eq!(s, 123);

その他

  • trim: 先頭と末尾の空白を削除する.
let s = "hello world\n".trim();
assert_eq!(s, "hello world");