Techioz Blog

Ruby – 配列内のエントリをカスタム区切り文字を使用して個別のエントリに分割します

概要

複数の値を含む配列があり、その一部を個別のエントリに分割したいと考えています。

array = [ 'foo', 'frob & baz', 'bar' ]
# I want to split these with ' & ' as a delimiter, to get this output:
result = [ 'foo', 'frob', 'baz', 'bar' ] 

配列を明示的に列挙する必要は避けたいと考えています。

解決策

配列を反復処理せずにこの問題を解決することは不可能です。配列の各要素を検査して、区切り文字が含まれているかどうかを確認する必要があります。どう切り分けても、「各要素を検査する」ということは、「配列を反復処理する」ということの別の言い方にすぎません。

私がそれにアプローチする方法は、配列のすべての要素をマップし、それらを区切り文字で分割することです。

array.map { _1.split(' & ') }
#=> [['foo'], ['frob', 'baz'], ['bar']]

ご覧のとおり、これによりほぼ望ましい結果が得られます。追加レベルのネストがあるだけで、これは flatten で削除できます。

array.map { _1.split(' & ') }.flatten(1)
#=> ['foo', 'frob', 'baz', 'bar']

ただし、map と flatten の組み合わせは無駄が多く、意図があまり伝わりません。ほぼすべての言語のほぼすべてのコレクション ライブラリに存在する、必要なことを正確に実行する標準メソッドがあります: flat_map:

array.flat_map { _1.split(' & ') }
#=> ['foo', 'frob', 'baz', 'bar']

Rubocop を使用している場合は、これについて警告が表示され (オプションのrubocop-performance 拡張機能を使用)、自動修正も行われます。