Ответ 1
Использовать Integer (строка)
Он вызовет ошибку ArgumentError, если строка не может преобразовать в целое число.
Integer('5abc') #=> ArgumentError: invalid value for Integer(): "5abc"
Integer('5') #=> 5
Вам все равно понадобится ваш метод number_or_nil, если вы хотите, чтобы поведение было таким, что nil возвращается, когда строка не может быть преобразована.
def number_or_nil(string)
Integer(string || '')
rescue ArgumentError
nil
end
Вы должны быть осторожны, чтобы избавиться от конкретного исключения. Скрытое спасение (например, "спасательный нуль" ) спасет от любой ошибки, которая наследуется от StandardError и может помешать выполнению вашей программы так, как вы этого не ожидаете. Integer() вызовет ArgumentError, поэтому укажите это.
Если вы предпочитаете не разбираться с исключениями и предпочитаете более короткую версию вашего number_or_nil, вы можете использовать неявные возвращаемые значения и записать их как:
def number_or_nil(string)
num = string.to_i
num if num.to_s == string
end
number_or_nil '5' #=> 5
number_or_nil '5abc' #=> nil
Это будет работать так, как вы ожидаете.