Rubyで個人的に面白い気づきがあったので記事にします。
[]を通常のインスタンスメソッドとして使っている例を発見
先日、担当しているプロジェクトで以下のようなコードを見ました。
ruby
array.[](0)
恥ずかしながら、一瞬、これは何をしているんだ?と戸惑ってしまいました。
[]は配列演算子として配列や文字列にドットなしでつけるのしか見たことがなかったからです。
Array#[]はインスタンスメソッドとして用意されているので、以下は同じ結果になります。
ruby
array = [1, 2, 3]
array[1] #=> 2
array.[](1) #=> 2 ([]メソッドの引数を()で指定している)
array[] 1 #=> 2 (()を省略)
どんなときに使うのか
これをどんな時に使うのか、という話ですが、例えば以下のようなかたちで&.
を使って、[]が使えないものがレシーバに来たときにNoMethodErrorの代わりにnilを返すことができます。
ruby
REGEX = /ab|ba/.freeze #=> 正規表現 abもしくはbaにマッチ
sample = ['a', 'b', 'c'].shuffle.join #=> abcをランダムに入れ替えて文字列にする
sample.match(REGEX)&.[](0) #=> matchするデータがあれば最初にマッチした部分を返す、matchするデータがない場合はnilを返してくれる
マッチしない時でもNoMethodErrorではなくnilを返して処理を続行したいときなどは便利になると思います。
追記
コメントでブロックを渡す方法も教えていただきました!
ruby
sample.match(REGEX) { |e| e[0] } #=> matchするデータがあれば最初にマッチした部分を返す、matchするデータがない場合はnilを返してくれる
さいごに
こんなの当たり前じゃんと言われるかもしれないですが、このように使う方法が頭に無かったので、大変勉強になりました。
今回は[]に遭遇したのですが、他の演算子でも同じようなことができる(<<
を .<<(...)
にできるなど)ということなので、自分の引き出しが増えた気がします。