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が偽として評価されないため、代入は行われない。
タイトルだけ見てもなんのことかわからないないと思いますが、下記のような構文です。
文字列の数字の配列から数値の配列を作成するコード 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)を作成して返します。
これによって、上記の例のように「&メソッドのシンボル」でメソッドの呼び出しができるという仕組みになっています。