语法
Array_of_Arrays(1)(2..5) := "asdf";
是合法的,假设你所拥有的实际上是一个数组数组。但是,我猜你不会。与某些语言(C、Java 等)不同,Ada 区分了多维数组和“数组的数组”。一个二维数组被声明为
type Array_Type is array (1 .. 10, 1 .. 5) of Character;
Array_2D : Array_Type;
(对于 3 维或更高维数组也是如此)。当您像这样声明数组类型时,您使用以逗号分隔的索引来引用单个元素:
Array_2D (2, 3) := 'x';
并不是
Array_2D (2) (3) := 'x'; -- wrong!! will not compile
您不能将切片用于多维数组:
Array_2D (1, 2..5) := "asdf";
语言设计者只是不允许这样做。
数组数组将被声明为:
type Array_Row is array (1 .. 5) of Character;
type Array_Of_Array_Type is array (1 .. 10) of Array_Row;
Array_Of_Arrays : Array_Of_Array_Type;
现在,由于数组行类型是独立的,因此您不必使用多维数组语法。要获得一个角色,你会使用类似的东西
Array_Of_Arrays (2) (3) := 'x';
做类似的事情是合法的
Array_Of_Arrays (1) (2..5) := "asdf";
但不是
Array_Of_Arrays (1, 2..5) := "asdf"; -- syntax error
关键是要记住,在这种情况下,数组的每一“行”都是一个单独的数组对象,具有自己的数组类型;而在多维情况下,行没有自己的类型。
您可以使用任何一种;在某些情况下,数组数组可能更合适,而在某些情况下,多维数组更合适。
由于 String 是一个数组类型,这也是一个数组数组:
type Array_Of_Strings is array (1 .. 10) of String(1..5);
这是合法的:
A : Array_Of_Strings;
A (3) (4) := 'y';
但不是
A (3, 4) := 'y'; -- illegal