Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
String::from() / to_string()
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として使えます。 |
サンプルコード
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生成 ---
let name = "Alice";
let age = 30;
let profile = format!("名前: {}、年齢: {}歳", name, age);
println!("{}", profile);
// --- String か &str かを判断する基準 ---
// 文字列の所有権が必要 → String
// 文字列を参照するだけ(読み取り専用)→ &str
}
概要
RustのStringは内部的にUTF-8バイト列を持つヒープ割り当てのデータ構造です。一方、『&str』はそのバイト列への参照(スライス)です。関数の引数として文字列を受け取る場合は、より汎用的な『&str』を型として使うのが慣習です(『&String』より『&str』の方が多くの型を受け付けられます)。
日本語などマルチバイト文字を含む文字列のスライスは、文字の境界でないバイト位置を指定するとパニックします。文字単位での操作には.chars()を使ってください。
文字列の結合・追加は『String::push_str() / push() / +』、長さ検索・判定は『String::len() / is_empty() / contains()』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。