Log目次

【Ruby】知っておくと便利な書き方

作成日 2019-10-17更新日 2019-10-17

はじめに

Rubyで知っておくと便利なコードの書き方をまとめます。

※新しくこれはいいなと思ったものがあれば追加していく予定です。

&.(通称「ぼっち演算子」)

通常nilのオブジェクトに対してメソッドを呼び出すと以下のように、エラーになります。

undefined method `size’ for nil:NilClass (NoMethodError)

これを回避する手段として、事前にnilチェックを行うか、ぼっち演算子が使用できます。

tmp = nil p tmp&.size 実行結果 nil ※エラーにならない

リファレンスによると、

メソッド呼び出しで .の代わりに &.を使うことができます。

この形式でメソッドを呼びだそうとすると、レシーバが nil の場合は 以下のように働きます。

レシーバが nil でない場合は通常のメソッド呼び出しが行われます。

とのことです。 hashの場合は、下記のように記載できます。

irb(main):023:0> tmp = { id: 1 } => {:id=>1} irb(main):024:0> tmp[:id] => 1 irb(main):025:0> tmp = nil => nil irb(main):026:0> tmp&.[]('id') => nil

hashそのものがnilになるケースがある処理の場合などに使用できると思います。

||演算子

例えば、a || bという書き方をします。 これは、左辺のaが偽であるならbの評価結果を返します。

irb(main):005:0> nil || 1 => 1 irb(main):006:0> nil || false => false irb(main):008:0> nil || nil => nil irb(main):009:0> 1 || 2 => 1 irb(main):010:0> true || false => true

これを使用して変数への代入、初期化を行うこともできます。 例えば、

といった下記の書き方ができます。

変数の代入 irb(main):013:0> tmp = nil || 'hoge' => "hoge" irb(main):014:0> p tmp "hoge" => "hoge" 左辺がnilなので右辺が評価される 変数の初期化 irb(main):003:0> tmp = nil => nil irb(main):004:0> tmp ||= 1 => 1 irb(main):005:0> p tmp 1 => 1 irb(main):006:0> tmp ||= 2 => 1 irb(main):007:0> p tmp 1 => 1

tmpという変数が偽として評価されれば代入する

2回目はtmpが偽として評価されないため、代入は行われない。

シンボル(Symbol).to_procをブロックに渡す

タイトルだけ見てもなんのことかわからないないと思いますが、下記のような構文です。

文字列の数字の配列から数値の配列を作成するコード irb(main):050:0> ['1', '2', '3'].map(&:to_i) => [1, 2, 3]

以下説明です。

まず、eachやmapなどでブロックで定義する内容をあらかじめ変数として定義しておき、それをあとでブロックとして渡すことができる「手続きオブジェクト」というものがあります。

リファレンス

pobj = proc {|v| p v } [1,2,3].each(&pobj) # 手続きオブジェクトをブロックの代わりに渡している => 1 2 3

そして、この手続きオブジェクトとして「メソッドのシンボル」を渡すと、シンボル.to_procという形式でブロックに渡すことになります。

「&シンボル」を渡すと、「シンボル.to_proc」をブロックとして渡すことができます。 リファレンス

to_proc?とは

to_procメソッドは、シンボルと同名のメソッドを使う手続きオブジェクト(Proc)を作成して返します。

これによって、上記の例のように「&メソッドのシンボル」でメソッドの呼び出しができるという仕組みになっています。

参考