Когда я хочу, чтобы преобразовать строку в целое число, если и только это строковое представление целого числа, я всегда использую Kernel::Integer:
arr = ["3", "a", "2", "0x01", "0c", "0b11", "0o03", "4", "1_000"]
arr.select { |s| Integer(s) rescue nil }.min_by { |s| Integer(s) }
#=> "0x01"
Здесь
arr.select { |s| Integer(s) rescue nil }
#=> ["3", "2", "0x01", "0b11", "0o03", "4", "1_000"]
Примечание "0x01".to_i #=> 0
(не!), поэтому Integer
необходимо использовать дважды.
Если строка не является представлением целого числа, Integer
вызывает исключение:
Integer("a")
#=> ArgumentError: invalid value for Integer(): "a"
который спасен в линии, в результате чего nil
должен быть возвращен, в результате чего является строка не выбрана. (Можно было бы, конечно, пойти на лишнюю милю и использовать предложение, которое снимает только ArguementError
исключений.)
Вопрос запрашивает возвращаемый элемент массива (строки). Если его число эквивалентно желателен, вы можете написать:
a = arr.map { |s| Integer(s) rescue nil }.compact.min
#=> 1
где
arr.map { |s| Integer(s) rescue nil }
#=> [3, nil, 2, 1, nil, 3, 3, 4, 1_000]
Примечание
['a', 'b'].map { |s| Integer(s) rescue nil }.compact.min
#=> nil
@steenslag Неясно, будут ли эти данные позитивными или нет, но в любом случае я добавил необязательный '-'. – tadman