我有一个这样的散列:
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。它变化。
我如何用单词选择和后面的一个或多个数字来挑选键?
奖金:
将散列转换为以tab (\t)作为分隔符的字符串。我这样做了,但它花了几行代码。通常大师级的卢比手可以在一行或几行内完成。
关于奖金问题:
If you have output from #select method like this (list of 2-element arrays):
[[:choice1, "Oh look, another one"], [:choice2, "Even more strings"], [:choice3, "But wait"]]
then simply take this result and execute:
filtered_params.join("\t")
# or if you want only values instead of pairs key-value
filtered_params.map(&:last).join("\t")
If you have output from #delete_if method like this (hash):
{:choice1=>"Oh look, another one", :choice2=>"Even more strings", :choice3=>"But wait"}
then:
filtered_params.to_a.join("\t")
# or
filtered_params.values.join("\t")
编辑到原始答案:即使这是答案(在此评论的时候)是所选的答案,这个答案的原始版本已经过时。
我在这里添加了一个更新,以帮助其他人避免像我一样被这个答案所迷惑。
正如另一个答案所提到的,Ruby >= 2.5添加了Hash#slice方法,这个方法以前只在Rails中可用。
例子:
> { one: 1, two: 2, three: 3 }.slice(:one, :two)
=> {:one=>1, :two=>2}
编辑结束。下面是最初的答案,我想如果你使用的是Ruby < 2.5而没有Rails,它会很有用,尽管我想这种情况在这一点上是相当不常见的。
如果使用Ruby,可以使用select方法。您需要将键从Symbol转换为String来进行regexp匹配。这将给你一个只有选项的新哈希。
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]