はじめに
RubyでAtCoderを解いていた時に見つけた~
の面白い動作をメモしておきます。
コードゴルフくらいには役に立ちそうです。
本文
解いていたAtCoderの問題を要約すると下記のようなものです
標準入力から与えられた文字に
A
が何文字目に含まれているか出力してください
問題を全文記述すると長くなるので割愛します。入力にA
が絶対含まれるものとしておいてください。
妥当に解くとこのようになるでしょうか
input = gets
puts (input =~ /A/) + 1
標準入力を変数inputに入れ、input =~ /A/
で何文字目にA
があるかマッチしています。+1
はinput =~ /A/
が0からカウントを始めるのでつけています。
問題のコード
以下のコードは綺麗に書こうと色々試しており、自分で書いておいて何故動くか全くわからなかったものです
gets
p ~/A/+1
解説
私が知らないだけで普通に本に載ってる程度の物でしたら恥ずかしいですが、私は調べても出てこなくて悩みました。
上記コードはgets
で標準入力を受け取り謎の~/A/
を出力しているように見えます。
ここでの重要な点は記事のタイトルにも書いている~
で、~
はgetsからの入力を受ける変数$_
とのパターンマッチをするためにも使われます。
$_
もあまり使わないものですが説明をする文章力がないので、コードを置いておきます。
gets
# getsで入力したものが表示される
puts $_
結論
要するに$_ =~ /A/
を~/A/
とすることができます。
これらの~
の動作はRegexpに定義されていました。
普段全然使いませんが綺麗に書くために役に立つかもしれません。先輩に聞こうと迷いましたが夜中なので自分で頑張って調べてついでに記事にしました。