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

Понимание типов данных в Ruby


Введение

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

Один из способов подумать о типах данных — рассмотреть различные типы данных, которые мы используем в реальном мире. Например, мы используем целые числа (0, 1, 2, …), целые числа (…, -1, 0, 1, …) и иррациональные числа (π).

Обычно в математике мы можем комбинировать числа из разных типов и получать какой-то ответ. Например, мы можем захотеть добавить 5 к π:

5 + π

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

5 + π = 5 + 3.14 = 8.14

Но если мы попытаемся вычислить числа с помощью другого типа данных, например, слов, все потеряет смысл. Как бы мы решили следующее уравнение?

sky + 8

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

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

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

Давайте начнем с того, как работать с целыми числами в Ruby.

Целые числа

Как и в математике, целые числа в компьютерном программировании — это целые числа, которые могут быть положительными, отрицательными или равными 0 (…, -1, 0, <1, …). Целое число также широко известно как int.

Вы можете распечатать целое число следующим образом:

print -25
Output
-25

Вы также можете сохранить целое число в переменной, а затем распечатать значение, сославшись на переменную:

my_int = -25
print my_int
Output
-25

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

sum = 116 - 68
print sum
Output
48

Когда мы пишем большие числа, мы обычно используем запятые, чтобы их было легче читать. Например, мы напишем 1 000 000 для \миллиона. Вы не можете использовать запятые в своем коде, но Ruby позволяет использовать символ подчеркивания (_). чтобы сделать большие числа более читаемыми.

Попробуйте:

large_number = 1_234_567
print large_number

Вы увидите целое число, напечатанное без подчеркивания:

Output
1234567

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

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

Числа с плавающей запятой

Число с плавающей запятой или число с плавающей запятой представляет собой действительное число. Действительные числа могут быть как рациональными, так и иррациональными числами; числа, содержащие дробную часть, например 9.0 или -116.42. Другими словами, число с плавающей запятой в программе Ruby — это число, содержащее десятичную точку.

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

print 17.3
Output
17.3

Вы также можете объявить переменную и присвоить значение с плавающей запятой:

my_float = 17.3
print my_float
Output
17.3

И, как и в случае с целыми числами, вы также можете выполнять математические операции с числами с плавающей запятой в Ruby:

sum = 564.0 + 365.24
print sum
Output
929.24

Если вы добавите число с плавающей запятой к целому числу в Ruby, вы получите число с плавающей запятой:

sum = 564 + 365.24
print sum
Output
929.24

Ruby будет рассматривать любое число, записанное без десятичных знаков, как целое число (как в 138), а любое число, записанное с десятичными знаками, как число с плавающей запятой (как в 138.0).

Далее, давайте посмотрим на булевы значения в Ruby.

Логические типы данных

Булевы значения используются для представления значений истинности, связанных с логическим разделом математики, который используется в алгоритмах информатики. В Ruby мы представляем этот тип данных одним из двух значений: true или false.

Многие операции в математике дают нам ответы, которые оцениваются как истинные или ложные:

  • больше, чем
  • 500 > 100 правда
  • 1 > 5 ложь
  • меньше
  • 200 < 400 правда
  • 4 < 2 ложь
  • равно
  • 5=5 правда
  • 500=400 ложь

Как и в случае с числами, вы можете сохранить значение true или false в переменной:

result = 5 > 8

Затем вы можете распечатать логическое значение с помощью вызова функции print():

print result

Поскольку 5 не больше 8, вы увидите следующий результат:

Output
false

По мере того, как вы будете писать больше программ на Ruby, вы лучше узнаете, как работают логические значения и как различные функции и операции, оценивающие значения true или false, могут изменить ход программы. .

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

Струны

строка – это последовательность из одного или нескольких символов, например букв, цифр и символов. Строки в основном существуют либо в одинарных кавычках (), либо в двойных кавычках () в Ruby, поэтому, чтобы создать строку, заключите последовательность символов в кавычки, например:

"This is a string in double quotes."

Небольшая программа «Привет, мир!» демонстрирует, как строка может использоваться в компьютерном программировании, поскольку символы, составляющие фразу Hello, World!, являются строкой.

print "Hello, World!"

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

output = "Hello, World!"

И распечатайте строку, вызвав переменную:

print output
Output
Hello, World!

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

Иногда вам нужно работать со списками данных. Вот где массивы пригодятся.

Массивы

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

Массивы определяются путем указания значений в квадратных скобках [ ], разделенных запятыми.

Массив целых чисел выглядит так:

[-3, -2, -1, 0, 1, 2, 3]

Массив поплавков выглядит так:

[3.14, 9.23, 111.11, 312.12, 1.05]

Вот список строк:

['shark', 'cuttlefish', 'squid', 'mantis shrimp']

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

sea_creatures = ['shark', 'cuttlefish', 'squid', 'mantis shrimp']

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

print sea_creatures
['shark', 'cuttlefish', 'squid', 'mantis shrimp']

Доступ к отдельным элементам в массиве осуществляется с помощью порядкового номера, начиная с 0.

puts sea_creatures[0] # shark
puts sea_creatures[2] # squid

Чтобы распечатать последнее значение, вы можете использовать индекс -1. Ruby также предоставляет методы .first и .last для захвата первой и последней записи соответственно:

puts sea_creatures.first # shark
puts sea_creatures.last # mantis shrimp

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

record = [
:en,
"Sammy",
42,
[
"coral",
"reef"
]
]

Массивы в Ruby являются изменяемыми, что означает, что вы можете добавлять значения, удалять значения и даже изменять записи в массиве.

Иногда нам нужен способ маркировать вещи в программе. Вот для чего нужны символы.

Символы

символ – это особый тип данных, который действует как метка или идентификатор в программе Ruby. Символы являются неизменяемыми, что означает, что их нельзя изменить. Символ выглядит как объявление переменной без значения. Вот пример символа:

:time_zone

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

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

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

Хэши

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

{"first_name" => "Sammy", "last_name" => "Shark"}

Вы можете назначать хэши переменным так же, как и другим типам данных:

user = {"first_name" => "Sammy", "last_name" => "Shark"}

Чтобы получить значения из хэша user, вы используете ключ для значения:

print user["first_name"] # "Sammy"
print user["last_name"] # "Shark"

Вы можете использовать символы в качестве ключей в хеше вместо строк:

user = {:first_name => "Sammy", :last_name => "Shark"}

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

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

print user[:first_name] # "Sammy"
print user[:last_name] # "Shark"

Вы также можете использовать немного другой синтаксис при определении хеша:

user = {first_name: "Sammy", last_name: "Shark"}

Этот синтаксис похож на синтаксис, используемый в JavaScript и других языках. Этот синтаксис определяет ключи как символы, поэтому вы можете получить доступ к записям, используя :first_name и :last_name вместо строк first_name и <фамилия.

Вы рассмотрели несколько типов данных, поэтому давайте посмотрим, как Ruby работает с этими типами.

Динамическая типизация

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

Переменной t в следующем примере может быть присвоен любой доступный тип данных:

t = 42 # t is an Integer
t = "Sammy" # t is a String
t = :sammy # t is a Symbol
t = true # t is a boolean (true)
t # t is nil

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

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

print "Please enter the length of the room: "
length = gets.chop

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

# Convert the amount to a Float.
length = length.to_f

Метод to_f преобразует строку в число с плавающей запятой. Ruby также предоставляет метод to_i для преобразования строк в целые числа, и большинство объектов можно преобразовать в строки с помощью метода to_s:

42.to_s # "42"
(42.5).to_s # "42.5"
["Sammy", "Shark"].to_s # "[\"Sammy\", \"Shark\"]"

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

print 5 + "5"
Output
TypeError: String can't be coerced into Integer

Как и этот код:

print "5" + 5
Output
TypeError: no implicit conversion of Integer into String

Если вы хотите сложить числа, чтобы получить 10, преобразуйте строку в целое число. Если вы хотите соединить их вместе, чтобы получить 55, преобразуйте целое число в строку.

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

Определение типов данных

В Ruby почти все является объектом. Целое число, число с плавающей запятой, массив, символ и хэш — все это объекты Ruby, и все они имеют метод с именем class, который сообщит вам, к какому типу они относятся. Даже логические значения true и false и значение nil являются объектами. Попробуй сам:

42.class # Integer
(42.2).class # Float
["Sammy", "Shark"].class # Array
true.class # TrueClass
nil.class # NilClass

Кроме того, вы можете использовать метод kind_of? для проверки определенного типа данных, например:

42.kind_of?(Integer) # true

Это особенно полезно, когда у вас есть переменная и вы хотите определить ее тип:

# somewhere in the code...
sharks = ["Hammerhead", "Tiger", "Great White"]
...
# somewhere else...

sharks.kind_of?(Hash) # false
sharks.kind_of?(Array) # true

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

if data.kind_of? String
data = data.to_f
end

Ruby также предоставляет метод is_a?, который делает то же самое, что и kind_of?, но может быть немного проще для некоторых разработчиков:

if data.is_a? String
data = data.to_f
end

Использование class, kind_of? и is_a? поможет вам убедиться, что вы работаете с нужными данными. Когда вы узнаете больше о Ruby, вы обнаружите другие способы обработки данных, не требующие явной проверки типа данных.

Заключение

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

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

  • Как работать со строками в Ruby
  • Как работать с массивами в Ruby
  • Как преобразовать типы данных в Ruby