Javaを20年やってきた自分が、Javaの先入観からかRustでString::from("hoge");
という書き方をすることに納得するまで時間を要したので整理。
Java
文字列リテラル=String
String
は固定長の文字列を扱うクラス。
+で連結できるが、インスタンスが保持している文字列に付け加えているわけではなく、新しいインスタンスが生成される。
Kotlinの場合は+演算子をオーバーロードしているが、起きていることはJavaと同じはず。
場合にもよるが、String
を連結したい場合はStringBuilder
を使うのが良いとされている。
※コンパイラがいい感じにしてくれるので、そこまで神経質にならなくても良いっぽい
Rust
文字列リテラル=&'static str
メモリ上の不変の部分に存在している。
文字列の連結など、可変長の文字列を扱う場合はString
。
String
の参照はそのまま&str
として扱うこともできる。
逆に、&str
を&String
扱いはできないので、String::from
やto_string
で変換(cloneして所有)する必要がある。
整理
書き方のせいであまり意識することはないが、Javaにおいても文字列リテラルのために確保されたメモリ領域を伸長して文字を追加したりはできない。
RustにおけるString::from("hoge");
を、Javaのnew StringBuilder("hoge");
だと思えば特に変な話ではない。