Мы собираемся создать метод с именем string_to_signed_number, который будет использовать предыдущий метод string_to_number для преобразования строки цифр в целое число. Новый метод позаботится только о знаке.

Первое, что нам нужно сделать в нашем новом методе, это посмотреть на первую цифру заданной строки. Нам нужно определить, является ли это знаком плюс, минус или просто обычная цифра.

Если первый символ — это знак «+» или «-», мы вырезаем его из строки и сохраняем в переменной:

sign = string.slice!(0) if string.start_with?('+', '-')

Мы только что посмотрели на первый символ переданной строки и определили, является ли он «+» или «-», используя метод String#start_with?.

start_with? в этом случае принимает 2 параметра и возвращает значение true, если хотя бы один из них верен. Итак, если строка начинается с плюса или минуса, она вернет true. В противном случае он вернет false, что означает, что строка начинается с обычной цифры и не имеет знака перед ней.

Если перед строкой стоит знак, мы используем метод String#slice!, чтобы удалить знак из строки и сохранить его в переменной с именем sign.

slice! изменит вызывающую программу, поэтому, если заданная строка была «-123», она будет преобразована в «123» после вызова slice!.

Использование предыдущего метода string_to_integer

Теперь, когда у нас есть строка без какого-либо знака перед ней, мы можем вызвать метод string_to_integer, как и раньше, и преобразовать строку в целое число. Мы присвоим возвращаемое значение переменной с именем result.

result = string_to_integer(string)

Но нам еще предстоит разобраться со знаком.

Если знак был плюс или нет, нам действительно больше нечего делать, и мы можем вернуть этот результат и выйти из метода.

Работа со знаком минус

Если знак был минус, нам нужно сделать еще один шаг и сделать целое число отрицательным, прежде чем мы вернем его. Для этого мы просто добавляем знак «-» перед нашим результатом, например:

-result

Итак, нам нужно еще одно условие if, которое проверяет, есть ли у нас sign и является ли эта переменная sign знаком "-". Если это так, мы возвращаем -result:

return -result if sign && sign == '-'

Это полный метод:

def string_to_signed_integer(string)
  sign = string.slice!(0) if string.start_with?('+', '-')
  result = string_to_integer(string)
  return -result if sign && sign == '-'
  result
end

Следующий шаг

В будущих постах мы сделаем обратное: напишем методы, преобразующие целое число в строку. Быть в курсе.