|
|
Rustの文字列リテラルの型が&str。
let s: &str = "abc";
文字列リテラルはダブルクォーテーション「"」で囲む。中で改行も出来る。
文字列リテラル内でダブルクォーテーションを書きたい場合はバックスラッシュ「\」を使ってエスケープする。[2025-08-28]
let s = "\"abc\"";
生文字リテラル「r#"〜"#」を使うと、バックスラッシュ「\」やダブルクォーテーション「"」をエスケープせずに記述することが出来る。[2025-08-28]
let s = r#""abc""#;
関数(やメソッド)の引数として文字列を受け取りたい場合は&strで受ければいい。
fn example1(s: &str) {
println!("{}", s);
}
引数の型を&strにしておくと、呼び出す側は、文字列リテラル(&str)の他に&Stringでも渡すことが出来る。
example1("abc");
let s: String = String::from("abc");
example1(&s);
関数の返り値として文字列リテラルを返したい場合は、&strにライフタイム('staticとか)を指定する。
fn example2() -> &'static str {
"abc"
}
しかし、文字列を返したい場合はStringを使うことの方が多いような気がする。
文字列を構造体(やタプル形式の列挙型)のフィールドに保持したい場合、&strは使わない方が良い。[2025-07-06]
(ライフタイムの問題が出てきてややこしくなる)
フィールドに文字列を保持する場合はStringにするのが一般的なようだ。
Rustでは関数のオーバーロードを作れない(引数の型が異なる同名関数を作れない)が、
ひとつの関数の引数で&strとOption<&str>のどちらでも受け取れるようにすることが出来る。
(何故そんなことをしたいかと言うと、Rustでは&strにnullを保持できないので、普段は&strで受け取りつつ、何も無いときはNoneが渡せると便利だから)
fn example3<'a, T: Into<Option<&'a str>>>(s: T) {
let s: Option<&str> = s.into();
match s {
Some(s) => println!("{}", s),
None => println!("None"),
}
}
example3("abc");
example3(None);