87
58

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 3 years have passed since last update.

Ruby ぼっち演算子について

Last updated at Posted at 2020-01-22

ぼっち演算子とは

早速本題に入っていきます。
ボッチ演算子とはRuby2.3から実装された機能です。正式には safe navigation operator と言います。
主に&.のことを示します。
##ぼっち演算子の意義
ぼっち演算子が意義を持つのは,レシーバーが
あるクラスのインスタンス
nil
のいずれか,といった場合です。
Rubyにはメソッドの返り値が「配列またはnil」「文字列またはnil」などを返すものが多いのでそのようなときにnilになったレシーバにnilに対応していないメソッドを使ってしまうとNoMethodError(そんなメソッドないよ!)というふうに返してしまいエラーが出てしまいます。
だからといって場合分けするとコードが複雑になるしコード量が増えてしまう。

そこで導入されたのが &. です。これはメソッド呼び出しの . と同じ使い方だけれど,レシーバーが nil のときだけはメソッドが呼び出されないで nil を返す、というものです。

ぼっち演算子使い方

基本的な使い方は下記のような記述方法です

オブジェクト&.メソッド

レシーバーとしての役割を持つオブジェクトに対してメソッドを実行した場合にそのレシーバーとしての役割を持つオブジェクトがnilだった場合にエラーが出てしまう可能性があるのですが、そのレシーバーが空のまま実装したいという時もあると思います。


@nickname = current_user.nickname

このような時です。このcurrent_userはログインしていない時はnilになってしまうのでログインしていないときにこのメソッドが実行されてしまうとエラーになってしまうのですがここでボッチ演算子を使うことでこのnilのcurrent_userをnilという表記で出力することができます。nilで返すことでエラーが消え、current_userに何も入っていない時でもページを表示することができます。

@nickname = current_user&.nickname

書き方はこの通りです。メソッドの前に&をつけるだけです。こうすることでcurrent_userはnilを返すことができるようになります。

少しわかりづらいかもしれないですが、オブジェクトがnilだった場合にnilに対応していないメソッド(NilClassに定義されていないメソッド)を呼び出すので、エラーが出る状況だったのを、オブジェクトがnilだった場合に戻り値にnilを返すメソッドに一時的に変えてしまうことでエラーを回避するという感じですかね。(実際の仕組みは分からない)

※nilに対応したメソッドの場合はボッチ演算子がなくてもエラーは出ない
Nilclassのメソッドの例:
&, =~, ^, nil?, rationalize, to_a, to_c, to_f, to_h, to_i, to_r, to_s, |

ボッチ演算子を使うにあたっての注意点

なおぼっち演算子を使ってもエラーが出ることがあります。それは
NoMethodError(そんなメソッドないよ!)
というようなエラーです。この場合はメソッドが間違っている場合があり、メソッド名を見直す必要ががありそうです。
また、レシーバとしての役割を持つオブジェクトがnilの場合はどんな間違ったメソッドを使ってもエラーが出ないので注意です。

#ぼっち演算子の名前の由来
おそらく気になった方も多いと思いますが、ぼっち演算子のぼっちの部分は&.がひとりぼっちで座っている姿に見えることから名付けられたそうです。遊び心があって面白いですね。

##参考
https://techacademy.jp/magazine/20567


87
58
3

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
87
58

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?