Преобразование типов данных в Ruby

Любая программа состоит из нескольких типов данных, но при этом следует иметь в виду, что одна операция выполняется в пределах одного типа: математические операции выполняются с числами, а конкатенация – со строками.

Иногда данные поступают из внешних источников, таких как клавиатура, API или база данных, и их нужно преобразовать, чтобы использовать в работе. Ruby предоставляет несколько методов преобразования значений из одного типа данных в другой. В этом мануале вы научитесь преобразовывать строки в числа, объекты в строки, строки в массивы, а также преобразовывать строки и символы.

Преобразование строк в числа

Для преобразования строк в числа Ruby предоставляет методы to_i и to_f. Метод to_i преобразовывает строку в целое число, а to_f – в число с плавающей точкой.

"5".to_i       # 5
"55.5".to_i    # 55
"55.5".to_f    # 55.5

Для примера попробуйте создать простую программу, которая запрашивает два числа и выводит их сумму. Создайте новый файл adder.rb и вставьте в него код:

print "What is the first number? "
first_number = gets.chop
print "What is the second number? "
second_number = gets.chop
sum = first_number + second_number
print sum

Запустите программу:

ruby adder.rb
What is the first number? 5
What is the second number? 5
55

Программа сообщает, что 5 и 5 в сумме дают 55. С точки зрения математики это неверный результат, но технически программа не ошиблась. Программа запрашивает числа, но ввод она принимает с клавиатуры: она получает не число 5, а символ 5. Другими словами, она принимает не число, а строку, и выполняет не сложение, а конкатенацию, потому в результате получается 55.

Чтобы это исправить, нужно преобразовать строки в числа. Чтобы преобразовать вводимые символы в числа с плавающей точкой, используйте метод to_f:

print "What is the first number? "
first_number = gets.chop
print "What is the second number? "
second_number = gets.chop
# convert strings to numbers
first_number = first_number.to_f
second_number = second_number.to_f
sum = first_number + second_number
print sum

Снова запустите программу:

ruby adder.rb

В этот раз она выведет такой результат:

What is the first number? 5
What is the second number? 5
10.0

Как видите, теперь программа правильно сложила числа.

Методы to_i и to_f особенным образом ведут себя со строками, которые не являются числовыми. Рассмотрим следующий пример:

"123-abc".to_i  # 123

В этом примере преобразование строки «123abc» в целое число выдаст результат 123. Метод to_i прерывает работу, как только достигает первого нечислового символа. Веб-разработчики Ruby используют это при создании URL-адресов, например 1-st-blog, где 1 – внутренний ID для поиска записи, а st-blog – текстовое описание в URL-адресе. Когда Ruby преобразует 1-st-blog в целое число с помощью метода to_i, в результате получится 1, а часть -st-blog усекается и отбрасывается. Затем целое число можно использовать для извлечения записи из базы данных.

Вот еще один интересный пример преобразования чисел:

"abc".to_i     # 0

В таком случае to_i вернет 0, поскольку не может преобразовать ни одного символа из строки. Иногда это приводит к неожиданным результатам и ошибкам. Если пользователь введет abc, а программа попытается преобразовать эту строку в число и разделить на него какое-либо значение, она выдаст ошибку, поскольку на 0 делить нельзя.

Для преобразования подобных строк Ruby предлагает другой способ – методы Integer и Float.

Integer("123")  # 123

Если метод Integer получает значение, которое нельзя преобразовать, Ruby выдает ошибку.

Integer("123abc")
ArgumentError: invalid value for Integer(): "123abc"

Затем вы можете обработать эту ошибку и предоставить пользователю сообщение с просьбой ввести правильные данные. Этот метод не так удобен, но он обеспечивает целостность данных.

Преобразование данных в строки

Ruby предоставляет метод to_s для преобразования данных в строки:

25.to_s                    # "25"
(25.5).to_s                # "25.5"
["John", "Smith"].to_s    # "[\"John\", \"Smith\"]"

Часто данные конвертируются в строки при создании выходных данных программы.

Для примера напишите программу, которая будет следить за ежедневным сжиганием калорий пользователя после тренировки. Чтобы отобразить прогресс, программа должна выводить строки и числовые значения одновременно. Создайте файл calories.rb со следующим кодом:

user = "John"
calories = 100
print "Congratulations, " + user + "! You just burned " + calories + " calories during this workout."

В коде этой программы указано имя пользователя и количество калорий, которые он потратил. Но в более сложных программах эти данные должны извлекаться из других источников.

Запустите программу:

ruby calories.rb
TypeError: no implicit conversion of Integer into String

Ruby не позволит добавить переменную calories в вывод, потому что это целое число. Вы не можете просто указать эти данные в виде строки, добавив кавычки, потому что данные о калориях происходят из неизвестного источника. Вместо этого нужно преобразовать данные о калориях в строку, чтобы присоединить их к остальной части вывода.

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

user = "John"
calories = 100
print "Congratulations, " + user + "! You just burned " + calories.to_s + " calories during this workout."

Снова запустите программу. Теперь вы увидите правильный результат:

Congratulations, John! You just burned 100 calories during this workout.

Функция интерполяции строк Ruby автоматически преобразует объекты в строки. Это наиболее предпочтительный метод создания вывода в программах Ruby.

Читайте также: Работа со строками в Ruby

Перепишите свою программу, добавив в нее функцию интерполяции:

print "Congratulations, #{user}! You just burned #{calories} calories during this workout."

Снова запустите программу. Вы получите тот же вывод.

Все объекты Ruby предоставляют собственную реализацию to_s, что иногда может возвращать неожиданные результаты. В некоторых ситуациях приходится писать специальный код или искать методы для форматирования данных, чтобы получить требуемый результат.

Примечание: Объекты Ruby также предоставляют метод inspect, который отлично подходит для отладки. Метод inspect работает так же, как to_s. Он возвращает строковое представление объекта и его данных. Метод inspect не используется в среде производства, но его можно использовать вместе с puts для просмотра переменных во время написания кода.

Преобразование строк в массивы

Для преобразования строк в массивы используйте метод split.

"one two three".split   # ["one", "two", "three"]

Чтобы задать символ, который используется в качестве разделителя, передайте его как аргумент метода split.

Попробуйте создать программу data_import.rb, которая содержит строку, в которой через запятую перечислены названия акул. Программа принимает данные, преобразует их в массив, сортирует и выводит каждый элемент на экран:

data = "Tiger,Great White,Hammerhead,Whale,Bullhead"
# Convert data to an array by splitting on commas
sharks = data.split(",")
# Sort the sharks alpabetically
sharks = sharks.sort!
# Print out the sharks
sharks.each{|shark| puts shark }
Запустите программу:
ruby data_import.rb
Bullhead
Great White
Hammerhead
Tiger
Whale

Массивы Ruby – очень производительные структуры.

Преобразование строк и символов

Иногда возникает необходимость преобразовать символ в строку, чтобы отобразить его. Также бывают ситуации, когда необходимо преобразовать строку в символ, чтобы использовать ее для поиска данных в хэше.

Метод Ruby to_s также работает с символами, поэтому с его помощью вы можете преобразовывать символы в строки.

:language.to_s   # "language"

Также это позволяет отобразить символ и изменить его. Например, эта программа принимает символ: first_name и преобразует его в удобочитаемую строку First name:

string = :first_name.to_s
# replace underscore with a space and capitalize
string = string.gsub("_"," ").capitalize

Чтобы преобразовать строку в символ, используйте метод to_sym:

"first_name".to_sym   # :first_name

Чтобы программа преобразовала строку «First name» в символ :first_name, нужно перевести все символы в нижний регистр и заменить пробелы нижним подчеркиванием.

string = "First name"
# replace spaces with underscores and convert to lowercase
string = string.gsub(" ","_").downcase
# Convert to symbol
symbol = string.to_sym

Заключение

Этот мануал научил вас преобразовывать разные типы данных в Ruby с помощью встроенных методов.

Читайте также:

Tags: