Rubocop の CollectionLiteralInLoop の対処法

2023.10.12 に公開記事は 3 分で読めます
サムネイル画像

こんにちは!
今回は Rubocop の Performance/CollectionLiteralInLoop ルールの解決方法について丁寧にお伝えします。

結論: どうしたら解決できるのか

ループ内で不変な配列リテラルを使用すると警告 が出るので、ループの外で配列を作成してループ内では参照する方法で解決します。

例を見ていきましょう!

arr = [1, 2, 3] # 配列をループ外で作成
arr.each do |num|
  puts num
end

このサンプルコードではループ外で配列 arr を作成し、ループ内で arr を使用しています。
arr はループが何度実行されても生成されないためリソースを節約できます。

解説: なぜそれで解決できるのか

illust

不変な配列リテラルとは

まず基礎からお伝えします。

不変な配列リテラルとは、[1, 2, 3] のような変更不可能な配列のことです。
これをループ内で使うとループのイテレーションごとに新しい配列が作成され、メモリやCPUリソースを浪費します。

そのため Rubocop のパフォーマンス警告が出るわけですね。

ループ外での配列作成のメリット

ループ外で配列を作成すると、その配列は一度だけ作成されるためリソースを節約できます。
特に大量のデータを処理する際や、高負荷な状況ではこの差が顕著に現れます。

また、コードの可読性も上がるでしょう。
更に、定義された配列がループ内で使われることが一目瞭然になり、保守性も向上します。

定数を使う場合

配列がプログラム全体で共有される場合は、定数を使うのも一つの方法です。
一般的に定数は大文字で始まりプログラムのどこからでもアクセス可能ですね。

ARR = [1, 2, 3].freeze # .freezeで変更不可に
ARR.each do |num|
  puts num
end

このコードでは ARR という定数に配列を代入し .freeze メソッドで配列を変更不可能にしています。
定数を使うと、配列が一度だけ生成されることが保証されリソースの節約につながりますね。

まとめ

ループ内で不変な配列リテラルを使うとリソースを浪費するため、ループ外で配列を作成してループ内ではその配列を参照することで解決します!

配列が全体で共有される場合は定数を使うと良いでしょう。

プロフィールアイコン

Syuu

フロントエンドが好きなWEBエンジニア Next.js / React / TypeScript

SHARE