はじめに
Ruby 2.7 以降に追加された新しめの文法を5つ紹介します。
業務で Ruby のアップデート、および rubocop のアップデートをしました。
その際に学んだことですので、rubocop 関連の記事を参考にしています。
Rails/WhereExists
where
してから exists?
するのではなく、exists?
単体でOK
# bad
User.where(name: 'john').exists?
# good
User.exists?(name: 'john')
Performance/MapCompact
map.compact
はfilter_map
で書き換えられる⚠︎
compact
は自身から nil
を取り除いた配列を生成して返します。
compact!
は自身から破壊的に nil
を取り除き、変更が行われた場合は self
を、そうでなければ nil
を返します。
# bad
ary.map(&:foo).compact
ary.collect(&:foo).compact
# good
ary.filter_map(&:foo)
# Enumerable#filter_map! というメソッドは存在しないので、以下のケースは例外となるので注意
ary.map(&:foo).compact!
⚠︎厳密には、置き換えられないケースもあります。
詳細は konic さんの記事を参照ください。
Performance/SelectMap
select.map
は filter_map
で書き換えられる
ただし、good ケースの可読性について賛否があるので使用時は注意。
# bad
ary.select(&:foo).map(&:bar)
ary.filter(&:foo).map(&:bar)
# good
ary.filter_map { |o| o.bar if o.foo }
⚠︎単純な置き換えができない場合があります。
Rails/RedundantPresenceValidationOnBelongsTo
presence validator
は自動的に追加され、明示的なpresence validation
は冗長
# bad
belongs_to :user
validates :user, presence: true
# good
belongs_to :user
Style/HashSyntax: Omit the hash value
ハッシュのキーと値が同じ場合は書かず、異なる (意図のある) 値は明示的に書く
これは Ruby3.1 からの追加されています。
# bad
{foo: foo, bar: bar}
# good
{foo:, bar:}
さいごに
全て知っていましたか?
自分はエンジニアになって5ヶ月ほどなので知らないことばかりでした!
実用性はともかく、更新される文法を追っていくのも楽しいですね!
参考