次のようなハッシュがあります:
params = { :irrelevant => "A String",
:choice1 => "Oh look, another one",
:choice2 => "Even more strings",
:choice3 => "But wait",
:irrelevant2 => "The last string" }
そして、choice+int ではないすべてのキーを拒否する簡単な方法が欲しいです。それは choice1 かもしれないし、choice1 から choice10 かもしれません。様々です。
choice という単語と、その後に続く数字だけでキーを特定するにはどうすればよいですか?
ボーナス:
ハッシュをタブ (\t) を区切り文字として文字列に変換します。私はこれを実行しましたが、数行のコードが必要でした。通常、熟練の Rubicians は 1 行かそこらでこれを実行できます。
ベストアンサー1
元の回答を編集: この回答は (このコメントの時点では) 選択された回答ですが、この回答の元のバージョンは古くなっています。
他の人が私のようにこの回答に惑わされないように、ここに更新を追加します。
他の回答で述べられているように、Ruby >= 2.5 では、Hash#slice
以前は Rails でのみ使用可能だったメソッドが追加されました。
例:
> { one: 1, two: 2, three: 3 }.slice(:one, :two)
=> {:one=>1, :two=>2}
編集終了。以下は元の回答ですが、Rails を使用せずに Ruby < 2.5 を使用している場合には役立つと思います。ただし、現時点ではそのようなケースはかなりまれだと思います。
Ruby を使用している場合は、select
メソッドを使用できます。正規表現の一致を行うには、キーをシンボルから文字列に変換する必要があります。これにより、選択肢だけを含む新しいハッシュが作成されます。
choices = params.select { |key, value| key.to_s.match(/^choice\d+/) }
またはdelete_if
既存のハッシュを使用して変更することもできます。例:
params.delete_if { |key, value| !key.to_s.match(/choice\d+/) }
または、必要なのがキーだけで値ではない場合、次のようにします。
params.keys.select { |key| key.to_s.match(/^choice\d+/) }
これにより、キーの配列が返されます。例:[:choice1, :choice2, :choice3]