String::from() / to_string()
| 対応: | Rust 1.0(2015) |
|---|
RustにはString型(所有権あり・可変)と文字列スライス『&str』(借用・不変)の2種類の文字列があります。『String::from()』や『to_string()』でString型を生成できます。
構文
// String型の生成方法です。
let s1 = String::from("hello"); // &str からStringを生成します。
let s2 = "world".to_string(); // to_string() を使う方法です。
let s3 = String::new(); // 空のStringを生成します。
let s4 = "hello".to_owned(); // to_owned() でもStringを作れます。
// &str(文字列スライス)はString型への参照またはリテラルです。
let literal: &str = "hello"; // 文字列リテラルは&str型です。
let borrowed: &str = &s1; // StringへのスライスはDeref強制で取れます。
let slice: &str = &s1[0..3]; // 範囲で一部を参照します。
// String と &str の相互変換です。
let s: String = String::from("hello");
let r: &str = &s; // &String → &str(Deref強制)
let s2: String = r.to_string(); // &str → String
生成方法一覧
| 記述方法 | 概要 |
|---|---|
| String::from("text") | &str からStringを生成します。最も一般的な方法です。 |
| "text".to_string() | ToString トレイト経由でStringを生成します。 |
| "text".to_owned() | ToOwned トレイト経由でStringを生成します。 |
| String::new() | 空のStringを生成します。 |
| String::with_capacity(n) | n バイト分の容量を事前確保してStringを生成します。 |
| format!("...") | フォーマットしたStringを生成します。 |
| "text"(リテラル) | &str型の文字列リテラルです(プログラムバイナリに埋め込まれます)。 |
| &s (&Stringから&str) | StringへのDeref強制で&strとして使えます。 |
サンプルコード
sample_string_from.rs
fn print_str(s: &str) {
// &str を受け取ります。String も &String から Deref 強制で渡せます。
println!("文字列: {}", s);
}
fn main() {
// --- String の生成 ---
let s1 = String::from("Hello, Rust!");
let s2 = "Hello, World!".to_string();
let s3 = String::new();
let s4 = String::with_capacity(50); // 50バイト確保します。
println!("s1: {}", s1);
println!("s2: {}", s2);
println!("s3(空): '{}'", s3);
println!("s4(空・容量50): len={}, capacity={}", s4.len(), s4.capacity());
// --- &str リテラル ---
let literal: &str = "hello";
println!("literal: {}", literal);
// --- String と &str の相互変換 ---
let owned: String = "Rust".to_string();
let borrowed: &str = &owned; // &String → &str(自動変換)
let owned2: String = borrowed.to_string(); // &str → String
println!("owned: {}", owned);
println!("borrowed: {}", borrowed);
println!("owned2: {}", owned2);
// --- 関数への渡し方 ---
// &str を受け取る関数には String も &str も渡せます。
print_str("文字列リテラル");
print_str(&s1); // &String → &str に自動変換されます。
// --- スライス ---
let hello = &s1[0..5]; // "Hello"(バイト単位の範囲指定)
println!("スライス: {}", hello);
// --- format! でのString生成 ---
// "八神庵" は UTF-8 で 9 バイト(3バイト×3文字)
let name = String::from("八神庵");
let org = String::from("八神流古武術");
let profile = format!("名前: {}、所属: {}", name, org);
println!("{}", profile);
println!("name.len() = {} (バイト数)", name.len()); // 9
println!("name.chars().count() = {} (文字数)", name.chars().count()); // 3
// --- String か &str かを判断する基準 ---
// 文字列の所有権が必要 → String
// 文字列を参照するだけ(読み取り専用)→ &str
}
rustc string_from.rs ./string_from s1: Hello, Rust! s2: Hello, World! s3(空): '' s4(空・容量50): len=0, capacity=50 literal: hello owned: Rust borrowed: Rust owned2: Rust 文字列: 文字列リテラル 文字列: Hello, Rust! スライス: Hello 名前: 八神庵、所属: 八神流古武術 name.len() = 9 (バイト数) name.chars().count() = 3 (文字数)
概要
RustのStringは内部的にUTF-8バイト列を持つヒープ割り当てのデータ構造です。一方、『&str』はそのバイト列への参照(スライス)です。関数の引数として文字列を受け取る場合は、より汎用的な『&str』を型として使うのが慣習です(『&String』より『&str』の方が多くの型を受け付けられます)。
日本語などマルチバイト文字を含む文字列のスライスは、文字の境界でないバイト位置を指定するとパニックします。文字単位での操作には.chars()を使ってください。なお、『.len()』はバイト数を返すため、「八神庵」は3文字ですが .len() は9を返します。
文字列の結合・追加は『String::push_str() / push() / +』、長さ検索・判定は『String::len() / is_empty() / contains()』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。