Rustで競プロがやりたい(6)

AtCoderの灰色を埋めると決め、githubに解いたコードをあげることにした。

github.com

とりあえず灰試験管は全て解くことができたが、かなり詰まってしまった。 Twitterで「これができない」だの「エラーが出る」だの言いまくって、その度に助けてくれた皆には感謝しかない。

灰色問題とはいえ、難易度が高かった。 特に文字列が難しい。

以下のような宣言だと、&strになる。

let S = "Moji";

それを.to_string()でStringになる。

let S = "Moji".to_string();

ところで、String型はstring型ではないらしい。 こういった大文字、小文字もしっかり区別してかかないといけない。

1文字1文字for文で見たいとなったときは、Stringを.chars()で変換しないといけない。

for s in S.chars() {
    // test
}

.chars()でCharsにしたのを.collect()で配列として代入したり。

let S = S.chars().collect::<Vec<char>>();

matchを使うには、.as_str()で変換しないといけなかったり。

match S.as_str() {
    "abc" => "YES",
    _ => "NO",
}

Stringのi番目の要素を取得したいとき、かなり面倒な手順になるし。

let s = S.chars().nth(i).unwrap();

逆に後ろの文字は.last()で取れるし。

let s = S.chars().last().unwrap();

文字列の操作をしているときにかなり見たのだが、unwrap()をよく使うことになる。 これは、Option型の結果が渡されるので、その中身の値を取り出す、という認識でいる。 本当はエラーを考慮しないといけなかったりしそうなのだが、今回は大丈夫ということにする。

とりあえずやりたいことに合わせて型を変えたり、配列に入れたり、結果を取り出したり...と結構覚えることがたくさんある。 特に型が違うとエラーで使えない、というのが頻発して大変だった。

これ以外にも色々覚えるべき文法はあるが、解き続けて覚えていくしかない。 残りの灰埋めを頑張ることにする。