Rustの文字列操作は、簡易スクリプト系のインタプリタ言語とは比べ物にならないぐらい難しいです。
PHPなどを習得した後で、C言語をやると思考がコケそうになるのも似たようなポイントかもしれませんね。
Rustの文字型のcharを含めた文字列をちゃんと理解しておきたいと思うので、学習を進めていきます。
文字型のchar
1文字のみで、u32(ビット)整数にキャストできる型。
charが"a"の文字コードを確認するコード
char.rs
fn main(){
let ch: char = 'a';
// キャラクターコードが"a"(97:0x61)の確認
if ch as u32 == 97{
println!("ch変数のcharコードは97(0x61)です。");
}
else{
println!("ch変数のcharコードは0x61じゃないよ。{}だよ。", ch as u32);
}
}
実行
input.rs
$ rustc char.rs
$ ./char
> ch変数のcharコードは97(0x61)です。
入力文字のasciiコードを取得するコード
fn main() {
println!("何か文字を入力して下さい:");
let mut word = String::new();
std::io::stdin().read_line(&mut word).ok();
let s = word.trim().to_string();
println!("入力した文字は、{}", s);
println!("入力した文字数は、{}", s.len());
for c in s.chars() {
println!("{} ({})", c, c as u32);
}
}
実行
$ rustc input.rs
$ ./input
> 何か文字を入力して下さい:
> test
> 入力した文字は、test
> 入力した文字数は、4
> t (116)
> e (101)
> s (115)
> t (116)
文字列定義
固定長といわれる、文字列の基本型のようなものの定義は次のように書きます。
string.rs
fn main(){
let s1 = "Hello World !!";
let s2 = "Hello World !!".to_string();
let s3:String = String::from("Hello World !!");
let s4:&str = "Hello World !!";
println!("{}" , s1);
println!("{}" , s2);
println!("{}" , s3);
println!("{}" , s4);
}
実行
$ rustc string.rs
$ ./string
> Hello World !!
> Hello World !!
> Hello World !!
> Hello World !!
どれも同じ結果になりますが、s3とs4の違いは、s3が固定長で、s4が可変長なのだそうです。
そして、s1とs4は同じ固定長で、s2とs3が可変長です。
文字列の連結
文字列2つ以上を連結してみます。
link.rs
fn main(){
let s1 = "Hello".to_string();
let s2 = "World".to_string();
let s3 = s1 + &s2;
println!("{}",s3);
}
実行
$ rustc link.rs
$ ./link
> HelloWorld
3つ以上の文字列を連結
push.rs
fn main(){
let s1 = "Hello";
let s2 = "World";
let s3 = "!!";
let mut s4 = String::new();
s4.push_str(s1);
s4.push_str(s2);
s4.push_str(s3);
println!("{}",s4);
}
実行
$ rustc push.rs
$ ./push
> HelloWorld!!
文字列の部分取り出し
part.rs
fn main(){
let s = "Hello World !!";
let part = &s[6..11];
println!("{}", part);
}
実行
$ rustc part.rs
$ ./part
> World
&s[6..11] この箇所で、文字列を配列のように取り出す事ができます。
6文字目(0スタート)から11文字までを抜き出すという意味ですね。
文字を含む確認
contains.rs
fn main(){
let s = "Hello World !!";
if s.contains("!") {
println!("included");
}
else{
println!("not includ");
}
}
実行
$ rustc contains.rs
$ ./contains
> included
分割と連結
split.rs
fn main(){
let s = "Hello World !!";
let sp: Vec<_> = s.split(" ").collect();
let cc = sp.concat();
let jo = sp.join(",");
println!("{}", cc);
println!("{}", jo);
}
実行
$ rustc split.rs
$ ./split
> HelloWorld!!
> Hello,World,!!
あとがき
プログラミングをやっていると、表示する文字や、データとしての文字列を色々といじくるケースが多く、
こうした操作に慣れることがプログラミングに慣れることと考えても良さそうです。
そして、文字列をいじくる時に、配列に分解したり、連結したり、正規表現検索をしたり、このあたりの操作は、プログラミングの醍醐味と言ってもいいかもしれません。
参考
RustのcharとStringと&str
Rustの文字列操作
RustCoder 避難所: 文字列
Magidropack’s blog: 【Rust】コンソールにて文字列を入力し、結果をprintにて出力させる方法
Rustのcharと&strとStringが難しい
文字列操作 with Rust
0 件のコメント:
コメントを投稿