Язык программирования Ada / Строки
Ada 2012 поддерживает три типа строк:
- Ada.String - строки фиксированной длины
- Ada.Strings.Bounded - ограниченные по длине строки
- Ada.Strings.Unbounded - неограниченные по длине строки
Каждый тип строки может быть реализован в одном из наборов символов:
- Character (по умолчанию)
- Wide_Character
- Wide_Wide_Character
Строки фиксированной длины (Ada.String)
Строки реализованы как массивы символов фиксированного размера и заданного типа (по умолчанию Character). Размер массива может быть определён во время исполнения программы (в фазе runtime), но после инициализации не может быть изменён. Для присвоения значений строке Ada имеет функции дополнения коротких значений и урезания чрезмерно длинных значений до размера массива.
with Ada.Strings.Fixed;
with Ada.Text_IO;
procedure Main is
-- Инициализируем строковую переменную с фиксированным размером (12 символов)
str: String := "Hello world!";
begin
Ada.Text_IO.Put_Line (str);
-- Результат: "Hello world!"
-- Заменим значение на более короткое,
-- остаток массива по умолчанию заполнится пробелами
Ada.Strings.Fixed.Move (
Source => "Hi world!",
Target => str
);
Ada.Text_IO.Put_Line (str);
-- Результат: "Hi world! "
-- Заменим значение на более короткое,
-- остаток массива заполним плюсами
Ada.Strings.Fixed.Move (
Source => "Hi world!",
Target => str,
Pad => '+'
);
Ada.Text_IO.Put_Line (str);
-- Результат: "Hi world!+++"
-- Заменим значение на более длинное,
-- переполнение массива обрежем справа
Ada.Strings.Fixed.Move (
Source => "Good morning world!",
Target => str,
Drop => Ada.Strings.Right,
Justify => Ada.Strings.Left
);
Ada.Text_IO.Put_Line (str);
-- Результат: "Good morning"
end Main;
Ограниченные по длине строки (Ada.Strings.Bounded)
Ограниченные по длине строки функционально повторяют строки с фиксированной длиной. Как и для строк с фиксированной длиной для них выделяется в памяти объём хранения на максимально допустимое количество символов. Для каждого лимита длины строк из шаблона формируется отдельный тип. В целом, использование bounded-строк рационально только при создании приложений подобных базам данных с колонками ограниченными по размеру, в прочих случаях их использование не рационально из-за громоздкого синтаксиса и выделения большого объёма памяти.
with Ada.Strings.Bounded;
with Ada.Text_IO;
procedure Main is
-- Инициализируем тип строк ограниченных сотней символов по длине
package String_100 is new Ada.Strings.Bounded.Generic_Bounded_Length (Max => 100);
-- Инициализируем строковую переменную значением в 12 символов
str: String_100.Bounded_String := String_100.To_Bounded_String ("Hello world!");
begin
Ada.Text_IO.Put_Line (String_100.To_String(str));
-- Результат: "Hello world!"
-- Заменим значение на более длинное, но допустимое
str := String_100.To_Bounded_String ("Good morning world!");
Ada.Text_IO.Put_Line (String_100.To_String(str));
-- Результат: "Good morning world!"
end Main;
Неограниченные по длине строки (Ada.Strings.Unbounded)
Unbounded-строки могут содержать значения любой длины вплоть до Integer'Last (т.о. ограничение максимальной длины зависит от компилятора). Неограниченные по длине строки из всех выше перечисленных типов дают наибольшую гибкость функций и удобный синтаксис.
with Ada.Strings.Unbounded;
with Ada.Text_IO;
procedure Main is
-- Инициализируем строковую переменную значением в 12 символов
str: Ada.Strings.Unbounded.Unbounded_String := Ada.Strings.Unbounded.To_Unbounded_String ("Hello world!");
begin
Ada.Text_IO.Put_Line (Ada.Strings.Unbounded.To_String(str));
-- Результат: "Hello world!"
-- Заменим значение на более длинное, но допустимое
str := Ada.Strings.Unbounded.To_Unbounded_String ("Good morning world!");
Ada.Text_IO.Put_Line (Ada.Strings.Unbounded.To_String(str));
-- Результат: "Good morning world!"
end Main;