0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[Ruby]配列演算子[]等をあえて通常ののインスタンスメソッドのように使う

Last updated at Posted at 2022-07-11

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を返してくれる

さいごに

こんなの当たり前じゃんと言われるかもしれないですが、このように使う方法が頭に無かったので、大変勉強になりました。

今回は[]に遭遇したのですが、他の演算子でも同じようなことができる(<<.<<(...)にできるなど)ということなので、自分の引き出しが増えた気がします。

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?