自分がほえーと思った小技などをメモしておく。
全てがベストプラクティスというわけではないので、状況に応じて使い分けたい。
(4/18 追記)
コメントより、「もっと簡単な書き方がある」とご教示いただきましたので追加しました。ありがとうございました。
Safe Navigation Operator(ぼっち演算子)
|
|
|
|
user.articles
だと、user
がnilになる場合にNoMethodErrorエラーが出る。そのため、userがあるかどうかifで判定しようとするが、ぼっち演算子を使うとシンプルに表記できる。
user
がnilの場合はuser&.articles
もnilになる。
user&.articles&.take&.tag&.name
のようにメソッドチェーンが長くなってもif文がネストすることがない。
ただし、user&.articles.take.tag.name
のようにすると、結局articles.take
のところでNoMethodErrorになるので注意。
NEWS for Ruby 2.3.0 (Ruby 2.7.0リファレンスマニュアル)
Hash#dig
|
|
|
|
|
|
ネストされたハッシュやjsonからデータを取り出したいときに使える。途中のデータがnilのときに自動的にnilを返してくれる。
ぼっち演算子と少し似ている。
Hash#dig (Ruby 2.7.0リファレンスマニュアル)
render(objects) || message
|
|
|
|
記事がないときのメッセージをif
を使わず簡単に表示できる。
a = b || c
の応用っぽい動き。
map(&:method)
|
|
map
やeach
のような配列のメソッドの書き方。(&:メソッド名)
で中身のオブジェクトそれぞれにメソッドを実行できる。
&演算子と、procと、Object#methodについて理解しなおす
if array.each do end.empty? end
|
|
|
|
articles ... end
を固まりとして、empty?
メソッドで判定している。
これの是非については、rubyでeachをする際に、中身が空であれば別の処理をさせるのコメント欄で議論がされていました。あまりわかりやすい書き方ではないようです。
配列をフィルタリングする
元々nilが入っている配列からnilを除く場合はcompact
を使う。
|
|
Array#compact (Ruby 2.7.0リファレンスマニュアル)
Enumerable#select/filter
filterはselectのエイリアス(Ruby2.6から)
|
|
条件などでフィルタリングしたい場合は、select
を使うと、{}
内の条件に合うものだけを格納した配列として返す。
Enumerable#filter (Ruby 2.7.0リファレンスマニュアル)
Enumerable#filter_map(Ruby2.7から)
条件でフィルタリングした後で配列の中身に編集を加える場合はこのように書く。
(例は不適かもしれません)
|
|
Ruby2.7ではfilter_map
というメソッドが追加されたので、このように書くことができる。
|
|
Module: Enumerable (Ruby 2.7.0)
Ruby 2.7がEnumerable#filter_mapを追加| Saelounブログ