Скажем, у меня есть хэш, как:Получить числовые ключи от Hash в Рубине
h = { '0' => 'foo', 'bar' => 'baz' => '2' => 'yada' }
Как будет идти об определении, если этот хэш имеет какие-либо цифровые клавиши в нем и вытащив значения этих ключей?
Скажем, у меня есть хэш, как:Получить числовые ключи от Hash в Рубине
h = { '0' => 'foo', 'bar' => 'baz' => '2' => 'yada' }
Как будет идти об определении, если этот хэш имеет какие-либо цифровые клавиши в нем и вытащив значения этих ключей?
попробовать это:
h.select {|key| [*0..9].map(&:to_s).include? key }
помню, что я не вытащил значение для вас, он просто возвращает выбор вашей хэш с требуемыми критериями. Вытягивание значений из этого хэша, как вы привыкли.
Если "числовые" означает целое число, то:
a = h.each_with_object([]) { |(k, v), a| a << v if(k.to_i.to_s == k) }
Если "числового" также включает в себя значение с плавающей точкой, то:
h.each_with_object([]) { |(k, v), a| a << v if(k =~ /\A[+-]?\d+(\.\d+)?\z/) }
Например:
>> h = { '0' => 'foo', 'bar' => 'baz', '2' => 'yada', '-3.1415927' => 'pancakes' }
=> {"0"=>"foo", "bar"=>"baz", "2"=>"yada", "-3.1415927"=>"pancakes"}
>> h.each_with_object([]) { |(k, v), a| a << v if(k =~ /\A[+-]?\d+(\.\d+)?\z/) }
=> ["foo", "yada", "pancakes"]
Вы можете для корректировки теста регулярных выражений, чтобы разрешить прокручивание пробелов (или нет).
Или для, возможно, немного более читаемых, но более решений, попробуйте:
class String def is_i? # Returns false if the character is not an integer each_char {|c| return false unless /[\d.-]/ =~ c} # If we got here, it must be an integer true end end h = {"42"=>"mary", "foo"=>"had a", "0"=>"little", "-3"=>"integer"} result = [] h.each {|k, v| result << v if k.is_i?}
Другим решение:
h.select {|k,v| k.to_i.to_s == k}.values
Это возвращает значения для ключей, которые являются целыми числами (положительными или отрицательными).