Rubyでnil値をマップして削除する方法 質問する

Rubyでnil値をマップして削除する方法 質問する

値を変更するか、または nil に設定する がありますmap。次に、リストから nil エントリを削除します。リストを保持する必要はありません。

現在私が持っているものは次のとおりです:

# A simple example function, which returns a value or nil
def transform(n)
  rand > 0.5 ? n * 10 : nil }
end

items.map! { |x| transform(x) } # [1, 2, 3, 4, 5] => [10, nil, 30, 40, nil]
items.reject! { |x| x.nil? } # [10, nil, 30, 40, nil] => [10, 30, 40]

次のようにループを実行して条件に応じて別の配列に収集できることはわかっています。

new_items = []
items.each do |x|
    x = transform(x)
    new_items.append(x) unless x.nil?
end
items = new_items

しかし、それはそれほど慣用的ではないようです。リストに関数をマップし、実行時に nil を削除/除外する良い方法はありますか?

ベストアンサー1

使用できるcompact:

[1, nil, 3, nil, nil].compact
=> [1, 3] 

ブロックの出力として nil を含む配列を取得しmap、そのブロックが条件付きで値を返そうとする場合は、コード臭が発生しているため、ロジックを再考する必要があることに注意してください。

たとえば、次のようなことを実行するとします。

[1,2,3].map{ |i|
  if i % 2 == 0
    i
  end
}
# => [nil, 2, nil]

では、やめましょう。代わりに、 の前に、map不要rejectなものやselect必要なものを次のように記述します。

[1,2,3].select{ |i| i % 2 == 0 }.map{ |i|
  i
}
# => [2]

混乱を解消するために を使用することは、通常、何が来るか分からなかったために正しく処理できなかったものを取り除く最後の手段であると考えていますcompact。プログラムでどのようなデータが投げ込まれているかを常に把握しておく必要があります。予期しない/不明なデータは良くありません。作業中の配列に nil を見つけたときはいつでも、それが存在する理由を調べ、配列を生成するコードを改善できないか確認します。Ruby が nil を生成して時間とメモリを浪費し、後で配列をふるいにかけてそれらを削除するのを許すのではなく。

'Just my $%0.2f.' % [2.to_f/100]

おすすめ記事