Я пытаюсь передать массив Unbounded_String в функцию, и меня не волнует диапазон индекса, так как функция собирается зацикливаться на каждом элементе.
Синтаксис (element1, element2) автоматически начинается с первого значения индекса в диапазоне, а затем увеличивается для второго заданного значения, которое отлично работает для более чем одного значения. Однако для одного значения это нельзя использовать, так как скобки считаются излишними.
Этот код показывает сообщения об ошибках для каждой попытки, которую я предпринял. (1) работает, но (2), предпочтительный синтаксис для передачи одноэлементного массива, нет. (3) работает, и дается в качестве ответа на этот похожий вопрос . Однако это жестко кодирует первый индекс диапазона в сторону вызова; если изменяется реализация String_Array, все колл-сайты должны быть изменены, даже если они не заботятся об используемых значениях индекса.
with Ada.Strings.Unbounded; use Ada.Strings.Unbounded;
procedure Main is
function "+"(S: String) return Ada.Strings.Unbounded.Unbounded_String
renames Ada.Strings.Unbounded.To_Unbounded_String;
type String_Array is array (Positive range <>) of Unbounded_String;
procedure Foo(input : in String_Array) is
begin
null;
end Foo;
begin
Foo((+"one", +"two")); --(1)
--Foo((+"only")); --(2) positional aggregate cannot have one component
Foo((1 => +"only")); --(3)
--Foo((String_Array'First => +"only")); --(4) prefix for "First" attribute must be constrained array
--Foo((String_Array'Range => +"only")); --(5) prefix for "Range" attribute must be constrained array
--Foo((String_Array'Range'First => +"only")); --(6) range attribute cannot be used in expression
--Foo((String_Array'Range'Type_Class'First => +"only")); --(7) range attribute cannot be used in expression
end Main;