Ruby .each が単一要素で失敗する

概要

次のようにすれば、配列を反復処理できます。

def source_names(packages)
    files = []
    packages.each do |package|
        files << (package + ".ads")
        files << (package + ".adb")
    end
    return files
end

ただし、配列 (またはおそらく任意のコレクション) が渡される場合に限ります。ただし、単一のパッケージのみがより大きなスクリプトの一部としてこのメソッドに渡される場合、型が配列内の単一の要素ではなく文字列であるように見えるため、これは失敗します。

‘source_names’: “Generics.Mathematics” の未定義メソッド ‘each’:String (NoMethodError)

では、文字列としてのみ認識される単一の要素のみが渡されることを気にしないようにするにはどうすればよいでしょうか?

説明: 文字列が配列メソッドをサポートしていないことはわかっています。私の混乱は、単一要素の配列ではなく、時々配列を取得し、他の場合は文字列を取得する理由です。

解決策

String クラスにはそれぞれのインスタンス メソッドがないため、この例外が発生します。

String.instance_methods.include?(:each) #=> false

パッケージが文字列の場合、その文字列だけで構成される配列を操作する必要があります。 Kernel#Array メソッドを使用して次のように記述できます。

Array(packages).each do |package|

Array(packages) は、packages が配列の場合はパッケージを返し、packages が単一要素 (ここでは文字列) の場合は [packages] を返します。

ただし、配列に単一の要素が含まれている場合でも、常に配列をメソッドに渡すことをお勧めします。