Новые конструкции в языке
Срезы многомерных массивов
begin
var m := Matr(||1,2,3,4|,|5,6,7,8|,|9,10,11,12||);
Println(m[:,:]); // [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
Println(m[::1,::1]); // [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
Println(m[1:3,1:4]); // [[6,7,8],[10,11,12]]
Println(m[::2,::3]); // [[1,4],[9,12]]
Println(m[::-2,::-1]); // [[12,11,10,9],[4,3,2,1]]
Println(m[^2::-1,^2::-1]); // [[7,6,5],[3,2,1]]
Println(m[:^1,:^1]); // [[1,2,3],[5,6,7]]
Println(m[1,:]); // [5,6,7,8]
Println(m[^1,:]); // [9,10,11,12]
Println(m[:,^1]); // [4,8,12]
end.
Лямбда-выражения с распаковкой параметров, являющихся кортежами или последовательностями
Теперь можно давать имена элементам кортежей прямо в параметрах лямбды. Чтобы распаковать параметр-кортеж t в переменные x и y, используется запись \(x,y)
. Это один параметр в отличие от записи (x,y)
, представляющей два параметра:
begin
var s := Seq(('Умнова',16),('Иванов',23),
('Попова',17),('Козлов',24));
Println('Совершеннолетние:');
s.Where(\(name,age) -> age >= 18).Println;
Println('Сортировка по фамилии:');
s.OrderBy(\(name,age) -> name).Println;
end.
Сравним со старым кодом:
begin
var s := Seq(('Умнова',16),('Иванов',23),
('Попова',17),('Козлов',24));
Println('Совершеннолетние:');
s.Where(x -> x[1] >= 18).Println;
Println('Сортировка по фамилии:');
s.OrderBy(x -> x[0]).Println;
end.
Уточнения в языке
Разрешена конструкция a as array of T
Ранее конструкция a as array of T
была запрещена на уровне грамматики. Таким образом, невозможно было выполнить DownCast привести к типу массива.
Теперь это ограничение снято
begin
var ob: object := new integer[2,3];
var a := ob as array [,] of integer;
end.