Просмотров-107
0

Структурированные типы данных языка программирования Crystal

Структурированные типы данных

Кратко о структурированных типах данных

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

Простые типы данных(переменных и констант) обеспечивают хороший фундамент для процедурного(структурного) программирования. Но по мере роста объема и сложности программ возникает необходимость обработки структурированных данных. Язык программирования Crystal предоставляет для этого ряд типов группировки, которые позволяют хранить немало информации в структурированном  виде.

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

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

Crystal  — это высокоуровневый объектно-ориентированный язык программирования. Поэтому в языке Crystal все — это объект. Известно, что « объект» это такой тип данных, который может содержать данные и код: данные в форме полей, часто называемые  атрибутами  или  свойствами,  и код в форме процедур, как правило, называемые методами.

Описание объекта определяет следующие свойства:

  • -он имеет тип;
  • -он может вызывать методы.

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

Классы

В объектно-ориентированном программировании объекты являются экземплярами классов. Класс представляет собой пользовательский(структурированный) тип данных или шаблон для создания объектов – экземпляров класса.

Класс в языке Crystal объявляется с помощью пары  ключевых слов class  —  end,  между которыми размещаются имя класса, переменные(свойства, атрибуты) и методы класса. Например, синтаксис объявления класса имеет вид.

  1. class Sensor                            #  имя класса
  2.   @izmPar: Float32                #  имя  переменной класса вещественного типа
  3.   def initialize(izmPar : Float32)   #  имя  метода класса(инициализация объекта)
  4.     @izmPar = izmPar             # инициализация через параметр
  5.     @speed = 0                                    #инициализация присваиванием
  6.   end
  7. end

Хранится  информация в переменных экземпляра, которые всегда начинаются с символа at ( @). 

Создание объекта(экземпляра класса) осуществляется методом new(конструктор класса). Вызов метода new осуществляется путем указания имени класса и имени метода, разделенных точкой(оператором).

sensor = Sensor.new(0)

Метод new создается автоматически для каждого класса. Он резервирует место в оперативной памяти, вызывает метод инициализации  «initialize», а затем возвращает вновь созданный объект. Объект создается в так называемой «куче» (общем массиве свободной оперативной памяти), и он снабжен уникальным идентификатором (object_id), сообщающим адрес ячейки памяти. Инициализация переменных класса при создании объекта осуществляется с помощью специального метода initialize, который также называется конструктором.

Обращение к элементам класса(атрибута и методам) осуществляется по имени объекта, как показано ниже.

  1. sensor.izmPar
  2. sensor.speed
  3. puts sensor.izmPar
  4. puts sensor.speed

Внимание! Внутреннее состояние объекта может быть получено только через вызов методов.

На основе существующего класса можно создавать новые классы. Это свойство называется наследованием классов. Каждый класс, определяемый структурированные данные, наследуется от другого класса. Класс Object является основой иерархии классов.

Производный класс наследует все переменные экземпляра и все методы экземпляра и класса суперкласса, включая его конструкторы ( new и initialize). Более подробно использование принципов объектно-ориентированного программирования на языке Crystal будет рассмотрено в следующей статье.

Структуры

Наиболее полно структурированные типы данных представляются структурами. Структура, как тип данных в языке программирования Crystal, определяется с помощью пары ключевых слов struct — end , например:

  1. struct Point
  2.   property x
  3.   property y
  4.   def initialize(@x : Float32, @y : Float32)
  5.   end
  6.    def print
  7.            puts «#{x} — #{y}»
  8.         end
  9. end

Объект структура создается аналогично объекту класса методом new.

point=Point.new(0,0)

Различия между структурой и классом:

вызов метода new структуры выделяет ей область памяти в стеке, а не в куче;

структура передается по значению, а класс передается по ссылке.

Структура неявно наследуется от класса Struct , которая наследуется от класса Value . Класс неявно наследуется от Reference .

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

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

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

Объявление структуры.

  1. struct Point
  2.   property x
  3.   property y
  4.   def initialize(@x : Float32, @y : Float32)
  5.   end
  6. end

Создание экземпляра.

point=Point.new(45,42)

Использование в программе

puts point.x    

puts point.y point.print          #вывод в одну строку

Результаты выполнения приведенного выше кода показаны на рисунке.

Структура - сложный структурированный тип данных

Массивы данных как объекты

Как указывалось ранее, массив в языке программирования Crystal это универсальная структура данных, содержащая элементы определенного или смешанного типа. В дополнение к материалу статьи “Изучение языка программирования Crystal. Типы данных” по массивам в данной статье массив представляется объектом(экземпляром класса Array) с рядом встроенных методов обработки элементов массива.

Кроме того, следует иметь в виду, что массивы хранятся в «общей куче» (динамически выделяемой области) памяти и не имеют фиксированного размера. Это позволяет изменять размер массива при выполнении программы. Однако это снижает производительность(быстродействие) программы.

 Если  требуется производительность, то надо использовать статические массивы «StaticArray», которые являются массивами фиксированного размера, помещаемым внутрь стека во время компиляции.

Применение операторов цикла для итерации массивов ограничено, особенно если размер массива меняется в процессе выполнения программы. Поэтому для итерации массивов целесообразнее использовать метод «each». Этот метод намного быстрее простого цикла «while» и не создает угрозы зацикливания программы вдоль строки путем индексации с помощью [].

Если требуется пройтись по всем значениям массива, то лучше сделать это с методом «each» или  одним из его вариантов. Например,

  1.   arr = [3,6,”Строка” 23, 15, “432”, 154]
  2. arr.each do |i|
  3.    puts i
  4.    end

Иногда требуется выполнить проверку на присутствие определенного элемента в массиве. Это можно сделать с помощью метода «includes?», который возвращает истинное значение true, при наличии элемента, или значение false при его отсутствии. Например,

  arr = [56, 123, 5, 42, 108]

  arr.includes? 42 #htpekmnfn => true

Если необходимо удалить начальный или конечный элементы массива, то это делается с помощью методов «shift» и «pop», соответственно.

  1.   arr = [56, 123, 5, 42, 108]
  2.    p arr.shift # => 56
  3.    p arr # => [123, 5, 42, 108]
  4.    p arr.pop # => 108
  5.    p arr # => [123, 5, 42]

Кроме того, можно добавлять и удалять элементы в массив.

Определить размер массива можно методом size, например.

   arr.size     #результат => 5

Результаты выполнения приведенного выше кода показаны на рисунке.

Структурированные типы данных  -  массив

«pp» и «inspect» полезны для отладки; printf и sprintf принимает строку в формате, свойственном языку программирования C; последний вариант (sprintf) возвращает тип String.

Хэши

Массивы хороши, если требуется получить информацию, исходя из ее положения в «списке», но иногда вместо этого возникает необходимость запросить данные, опираясь на ключевое значение. Хэши делают это удобнее и проще.

Тип данных Hash (key, value), основан на типе ключа key  и типе значения value. Например, объявляется пустой хэш. Как и в случае с массивами, необходимо уточнить типы ключа и значения. Создание пустого хэша с ключом и значением типа Int32 выполняется следующим образом

{} of Int32 => Int32   

Анагогично с помощью метода new

Hash(Int32, Int32).new

Часто хэши используются для формирования списков. Например, создается хэш

sp = {n: Int32, fio: String}

В данном случае ключ имеет целый тип .Int32, а значение – строковый тип String.

Hash (Int32, String,).

Затем он заполняется данными

sp={1,»Абрамов», 2, «Борисов», 3,»Воронин»}

Порядок работы с переменными типа Hash следующий.

Для переменной типа hash можно использовать обычное, как для массивов «индексное» представление, отличие лишь в том, что теперь вместо индекса используется ключ. Например, добавить новую пару ключ-значение или изменить существующую пару довольно просто.

Кроме того, поскольку хэш это объект класса Tuple, то он обладает набором методов, которые можно вызывать для выполнения. Например, проверка наличия элемента в хэше, осуществляется методом includes.

fam= sp.includes? «Абрамов»

puts «#{«Абрамов»} -> #{fam}»

Определение размера хэша, осуществляется методом size.

razm=sp.size    #(1,»Абрамов»)

puts «#{«Размер»}, -> #{razm}»

Определение  типа хэша, осуществляется методом typeof.

tip=typeof(sp)

puts «#{«Тип»}, -> #{tip}» Таким образом, хэши, как и массивы,  наследуют все методы соответствующих классов, которые можно найти в документации к API языка Crystal.

Результаты выполнения приведенного выше кода показаны на рисунке.

Структурированные типы данных - хэш

Кортежи

Структурированные типы данных, такие как массивы и хеши, упрощают создание более сложных приложений. Однако  Crystal предлагает больше возможностей на базе других моделей данных, таких как кортежи и наборы. Кортежи группируют связанные значения для различных (но не обязательно) типов данных. Кортежи являются экземплярами класса Tuple. Их можно создавать, записывая значения внутри фигурных скобок {}, или с помощью конструктора Tuple.new:

tpl = Tuple(Int32, String, String)

a = Tuple.new(142, «ИСТ», «Дятлов»)

Индекс проверяется, и в тех случаях, когда он неверен и вы использовали литералы  возникает ошибка во время компиляции; простое несовпадение индекса  ошибка индексирования (IndexError) во время выполнения.

В языке Crystal также имеются именованные кортежи, которые подобны реестрам или протоколам, применяемым в некоторых языках программирования:

 imtpl = {name: «Crystal», year: 2017} # NamedTuple(name: String, year: Int32)

  imtpl[:name] # => «Crystal» (String)

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

Для ключей символьного или строкового типа можно использовать именованные кортежи:

 Вместо этого of {:key1 => ‘a’, :key2 => ‘b’} можно использовать:

   {key1: ‘a’, key2: ‘b’}

  Вместо этого  of {«key1» => ‘a’, «key2» => ‘b’} можно использовать:

   {«key1»: ‘a’, «key2»: ‘b’}

Для переменной типа Tuple можно использовать аналогичные методы  класса Tuple, такие как «size, each, includes?, map» и так далее. Поскольку кортежи создаются в стеке, они легковесны и подвижнее массивов, которым выделено место в общей «куче» оперативной памяти, особенно при размещении внутри циклов.

Результаты выполнения приведенного выше кода показаны на рисунке.

Структурированные типы данных - кортеж

Заключение

Crystal  — это высокоуровневый объектно-ориентированный язык программирования. Класс в языке Crystal являются основой структурированных типов данных.

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

Статьи по теме

Изучение языка
программирования Crystal.
Типы данных
Язык программирования Crystal Изучение управляющих
конструкций языка
программирования Crystal
Изучение языка программирования Crysal Управляющие конструкции
Процедурное
программирование
на языке Crystal
Процедурное программирование на языке Crystal Объектно — ориентированное
программирование на языке Crystal
Объектно ориентированное программирование

Статьи по теме

.

Партнерские программы

Кто хочет стать моим партнером в R-MONEY.RU жмите на кнопку на рисунке

.

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

ПОДПИСКА НА РАССЫЛКУ

Статьи об онлайн курсах обучения

Дистанционное обучение
Обучение программированию
Проектирование информационных систем
 

brasm

Пенсионер с 33 - летним педагогическим стажем

Добавить комментарий

Ваш адрес email не будет опубликован.