我有一个散列,它将有类似entry1、entry2等的条目,我试图计算它们出现的次数,但我也有一个类似entry的条目因此,当我试图计算它们出现的次数时,“entry_hello”也会被计算在内。我在这里有这个代码来查看每个条目是否匹配,但这并不像我期望的那样工作。
hash = {}
hash['entry'] = 'Test1'
hash['entry_date'] = 'Test2'
hash['entry2'] = 'Test3'
hash.each do |x|
puts x.to_s.scan(/entry\d?$/).count
end
但在这种情况下,什么都找不到,但是如果没有
$
,则计算“entry_hello”。我试过使用字符串,但当我尝试使用散列键时,它不起作用。我不明白为什么它不起作用,我想知道以太如何使它起作用或其他方法来实现这一点。更新:
对于任何关心的人:我的代码不起作用的原因是在本例中
x
是键/值对,因此x
不等于'entry'或'entry2',而是等于'entrytest1'或'entry2test3'。sawa的答案是有效的,因为
hash.count{|k, _| k =~ /\Aentry\d?\z/}
中的下划线表示闭包接受第二个参数时,它不会被赋值。我可能会继续使用
hash.keys.count{|k| k =~ /\Aentry\d?\z/ }
,因为这对我来说更容易理解。这里的关键是key's
部分,因为现在您只查看散列的键,而不是键和值。 最佳答案
hash.count{|k, _| k =~ /\Aentry\d?\z/}
'entry_date'
将匹配/entry\d?/
而不匹配\z
或$
。