こんにちは!
今回は Rubocop の Performance/CollectionLiteralInLoop
ルールの解決方法について丁寧にお伝えします。
ループ内で不変な配列リテラルを使用すると警告 が出るので、ループの外で配列を作成してループ内では参照する方法で解決します。
例を見ていきましょう!
arr = [1, 2, 3] # 配列をループ外で作成
arr.each do |num|
puts num
end
このサンプルコードではループ外で配列 arr
を作成し、ループ内で arr
を使用しています。arr
はループが何度実行されても生成されないためリソースを節約できます。
まず基礎からお伝えします。
不変な配列リテラルとは、[1, 2, 3]
のような変更不可能な配列のことです。
これをループ内で使うとループのイテレーションごとに新しい配列が作成され、メモリやCPUリソースを浪費します。
そのため Rubocop のパフォーマンス警告が出るわけですね。
ループ外で配列を作成すると、その配列は一度だけ作成されるためリソースを節約できます。
特に大量のデータを処理する際や、高負荷な状況ではこの差が顕著に現れます。
また、コードの可読性も上がるでしょう。
更に、定義された配列がループ内で使われることが一目瞭然になり、保守性も向上します。
配列がプログラム全体で共有される場合は、定数を使うのも一つの方法です。
一般的に定数は大文字で始まりプログラムのどこからでもアクセス可能ですね。
ARR = [1, 2, 3].freeze # .freezeで変更不可に
ARR.each do |num|
puts num
end
このコードでは ARR
という定数に配列を代入し .freeze
メソッドで配列を変更不可能にしています。
定数を使うと、配列が一度だけ生成されることが保証されリソースの節約につながりますね。
ループ内で不変な配列リテラルを使うとリソースを浪費するため、ループ外で配列を作成してループ内ではその配列を参照することで解決します!
配列が全体で共有される場合は定数を使うと良いでしょう。