Поиск по сайту:

Как преобразовать типы данных в 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

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

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

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

Эта программа говорит, что сумма 5 и 5 равна 55. Вы знаете, что это неправильно, но технически компьютер не ошибается. Программа запросила два числа, но вы набрали их на клавиатуре. Вы не отправили число 5; вы отправили символ 5. Другими словами, ваша программа видела оба ваших ввода как строки, и когда вы складываете строки 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

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

  1. ruby adder.rb

На этот раз вывод будет другим:

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

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

Методы to_i и to_f имеют интересное поведение, когда строки не являются числовыми. Например:

"123-abc".to_i
Output
123

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

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

"abc".to_i
Output
0

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

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

Integer("123")
Output
123

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

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

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

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

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

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

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

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

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

Создайте файл с именем calories.rb со следующим содержимым:

user = "Sammy"
calories = 100

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

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

Запустите следующую программу:

  1. ruby calories.rb

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

Output
... TypeError: no implicit conversion of Integer into String (TypeError)

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

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

user = "Sammy"
calories = 100

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

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

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

Другой вариант — использовать функцию интерполяции строк 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
Output
["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 alphabetically
sharks = sharks.sort!

# Print out the sharks by iterating through the array
sharks.each{|shark| puts shark }

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

  1. ruby data_import.rb

Это результат:

Output
Bullhead Great White Hammerhead Tiger Whale

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

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

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

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

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

:language.to_s
Output
"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
Output
: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:

  • Как работать со строками в Ruby
  • Как работать с массивами в Ruby