Как конвертировать типы данных в Ruby

Вступление

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

Иногда данные поступают из внешних источников, таких как клавиатура, ответ 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

Давайте продемонстрируем это, создав небольшую программу, которая запрашивает два числа и отображает сумму. Создайте новую Ruby-программу под названием + adder.rb + со следующим кодом:

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
OutputWhat is the first number?
What is the second number?

Эта программа говорит, что сумма + 5 + и + 5 + равна + 55 +. Вы знаете, что это неправильно, но технически компьютер не ошибается. Наша программа запросила два числа, но мы набрали их на клавиатуре. Мы не отправили number 5; мы отправили character " 5 ". Другими словами, наша программа видела оба наших ввода как строки, и когда вы добавляете строки " 5 " и " 5 " вместе, вы получаете новую строку " 55 " ,

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

adder.rb

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 +. На этот раз вы увидите этот вывод:

OutputWhat is the first number?
What is the second number?

Когда вы снова введете + 5 + и + 5 +, вы получите + 10.0 + на этот раз.

Методы + to_i + и + to_f + имеют несколько интересных вариантов поведения, когда строки не являются числовыми. Посмотрите на следующий пример:

"123-abc".to_i  # 123

В этом примере преобразование строки " 123abc " в целое число приводит к целому числу + 123 +. Метод + to_i + останавливается, как только он достигает первого нечислового символа. Веб-разработчики Ruby используют это, создавая URL-адреса, такие как + 15-sammy-shark +, где + 15 + - внутренний идентификатор для поиска записи, но + sammy-shark + дает текстовое описание в URL-адресе. Когда Ruby преобразует + 15-sammy-shark + в целое число с + to_i +, результатом является + 15 +, а часть + -sammy-shark + обрезается и отбрасывается. Затем можно использовать целое число для извлечения записи из базы данных.

Вот еще один пример целочисленного поведения, которое может застать вас врасплох:

"abc".to_i     # 0

В этом примере метод + to_i + возвращает + 0 +, поскольку ни один из символов в строке не может быть преобразован. Это может привести к нежелательному поведению; если пользователь вводит " abc " в вашу программу, и вы конвертируете это значение в целое число и делите некоторое число на это значение, ваша программа завершится сбоем, поскольку она не может делиться на ноль.

Ruby предлагает другой способ выполнить это преобразование. Вместо этого вы можете использовать методы + Integer + и + Float + для преобразования данных:

Integer("123")  # 123

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

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

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

Давайте посмотрим, как преобразовать другие типы данных в sttings дальше.

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

Ruby предоставляет метод + to_s + для преобразования любого другого типа в строку:

25.to_s                    # "25"
(25.5).to_s                # "25.5"
["Sammy", "Shark"].to_s    # "[\"Sammy\", \"Shark\"]"

Вы будете часто преобразовывать данные в строки при создании вывода программы.

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

calories.rb

user = "Sammy"
calories = 100

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

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

Запустите программу с помощью + ruby ​​calories.rb +.

Когда вы запустите эту программу, вы увидите эту ошибку:

OutputTypeError: no implicit conversion of Integer into String

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

Измените строку вывода так, чтобы она преобразовывала + calories + в строку, используя метод + to_s +:

calories.rb

user = "Sammy"
calories = 100

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

Запустите программу еще раз, и вы увидите ожидаемый результат:

OutputCongratulations, Sammy! You just burned 100 calories during this workout.

Https://www.digitalocean.com/community/tutorials/how-to-work-with-strings-in-ruby#using-string-interpolation[string интерполяция] в Ruby автоматически преобразует объекты в строки для вас. Это предпочтительный метод для создания выходных данных в программах на Ruby.

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

calories.rb

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

Запустите программу еще раз, и вы увидите тот же результат.

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

Давайте посмотрим, как преобразовать строку в массив.

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

Если у вас есть строка, вы можете преобразовать ее в массив, используя метод + 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 +, и вы увидите следующее:

OutputBullhead
Great White
Hammerhead
Tiger
Whale

Массивы Ruby - это мощные структуры данных. Это демонстрирует один из способов их использования для обработки данных.

Наконец, давайте посмотрим, как конвертировать строки и символы.

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

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

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

:language.to_s   # "language"

Это очень удобно, если вам нужно отобразить символ и изменить его внешний вид. Например, эта программа берет символ +: 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 +, вы должны ввести все буквы в нижнем регистре и заменить пробелы подчеркиванием:

string = "First name"

# replace spaces with underscores and convert to lowercase
string = string.gsub(" ","_").downcase

# Convert to symbol
symbol = string.to_sym

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

Заключение

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

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