Любая программа состоит из нескольких типов данных, но при этом следует иметь в виду, что одна операция выполняется в пределах одного типа: математические операции выполняются с числами, а конкатенация – со строками.
Иногда данные поступают из внешних источников, таких как клавиатура, 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 с помощью встроенных методов.
Читайте также: