Seq(1,2,3) + Seq(5,6,7)
Seq(1,2,3) + Arr(5,6,7)
Кроме того, к последовательности некоторого типа можно присоединить операцией + значение этого типа как первый или последний элемент последовательности, например:
Seq(1,2,3) + 5
3 + Seq(5,6,7)
3 + Seq(5,6,7) + 9
Операция + является сокращённым вариантом операции Concat.
Элементы последовательности можно обойти с помощью цикла foreach:
foreach var x in s do
if x>2 then
Print(x);
Переменной типа последовательность с элементами типа T можно присвоить одномерный массив array of T, список List
Для последовательностей доступны многочисленные методы обработки последовательностей.
Для последовательностей доступны также стандартные функции обработки последовательностей.
Записи
Запись представляет собой набор элементов разных типов, каждый из которых имеет свое имя и называется полем записи. Тип записи в классическом языке Паскаль описывается следующим образом:
record
end
где описания полей имеет такой же вид, что и раздел описания переменных без ключевого слова var.
Например:
type
Person = record
Name: string;
Age: integer;
end;
Переменные типа запись хранят в непрерывном блоке памяти значения всех полей записи.
Для доступа к полям записей используется точечная нотация:
var p: Person;
begin
p.Name := 'Иванов';
p.Age := 20;
writeln(p); // (Иванов,20)
end.
По умолчанию процедура write выводит содержимое всех полей записи в круглых скобках через запятую.
В PascalABC.NET внутри записей допустимо определять методы и свойства, а также использовать модификаторы доступа. Таким образом, описание записи в PascalABC.NET имеет вид:
record
секция1
секция2
...
end
Каждая секция имеет вид:
модификатор доступа
описания полей
объявления или описания методов и описания свойств
Модификатор доступа в первой секции может отсутствовать, в этом случае подразумевается модификатор public (все члены открыты).
Например:
type
Person = record
private
Name: string;
Age: integer;
public
constructor Create(Name: string; Age: integer);
begin
Self.Name := Name;
Self.Age := Age;
end;
procedure Print;
end;
procedure Person.Print;
begin
writelnFormat('Имя: {0} Возраст: {1}', Name, Age);
end;
Как и в классах, методы могут описываться как внутри, так и вне тела записи. В примере выше конструктор описывается внутри записи, а метод Print объявляется внутри, а описывается вне тела записи. Метод-конструктор всегда имеет имя Create и предназначен для инициализации полей записи.
При описании переменной или константы типа запись можно использовать инициализатор записи (как и в Delphi Object Pascal):
const p: Person = (Name: 'Петрова'; Age: 18);
var p: Person := (Name: 'Иванов'; Age: 20);
Конструкторы для записей имеют тот же синтаксис, что и для классов. Однако, в отличие от классов, вызов конструктора записи не создает новый объект в динамической памяти, а только инициализирует поля записи:
var p: Person := new Person('Иванов',20);
Более традиционно в записи определяется обычный метод-процедура, традиционно с именем Init, инициализирующая поля записи:
type
Person = record
...
public
procedure Init(Name: string; Age: integer);
begin
Self.Name := Name;
Self.Age := Age;
end;
...
end;
...
var p: Person;
p.Init('Иванов',20);
В системном модуле определена также функция Rec, которая создает переменную типа запись на лету:
var p := Rec('Иванов',20);
Println(p); // (Иванов,20)
Тип этой записи - безымянный. Поля данной записи автоматически именуются Item1, Item2 и т.д.:
Println(p.Item1, p.Item2); // Иванов 20
Список отличий между записями и классами приводятся ниже: