Ao tentar obter o primeiro ou último índice de uma string ilimitada, conforme mostrado neste programa
with Ada.Strings; use Ada.Strings; -- for `Backward`
with Ada.Strings.Unbounded;
with Ada.Text_IO; use Ada.Text_IO;
procedure Foo is
package U_Str renames Ada.Strings.Unbounded;
S : U_Str.Unbounded_String := U_Str.To_Unbounded_String ("example unbounded string");
I : Natural := U_Str.Index (Source => S,
Pattern => "s",
Going => Backward,
From => S'Last);
begin
Put_Line (I'Image);
end Foo;
GNAT reclama de U_Str.Unbounded_String
ser um tipo privado:
$ gnatmake foo.adb
x86_64-linux-gnu-gcc-10 -c foo.adb
foo.adb:12:41: prefix for "Last" attribute may not be private type
gnatmake: "foo.adb" compilation error
Não entendi isso, o mesmo programa com um regular String
funciona bem:
with Ada.Strings; use Ada.Strings; -- for `Backward`
with Ada.Strings.Fixed;
with Ada.Text_IO; use Ada.Text_IO;
procedure Foo is
package F_Str renames Ada.Strings.Fixed;
S : String := "example fixed string";
I : Natural := F_Str.Index (Source => S,
Pattern => "s",
Going => Backward,
From => S'Last);
begin
Put_Line (I'Image);
end Foo;
$ gnatmake foo.adb
x86_64-linux-gnu-gcc-10 -c foo.adb
x86_64-linux-gnu-gnatbind-10 -x foo.ali
x86_64-linux-gnu-gnatlink-10 foo.ali
$ ./foo
15
As strings ilimitadas não têm atributos 'First
and 'Last
? O Manual de Referência Ada apenas afirma
Os seguintes atributos são definidos para um prefixo A que é de um tipo de matriz (após qualquer desreferência implícita) ou denota um subtipo de matriz restrito
mas não diz nada sobre tipos privados. Isso é um bug do GNAT ou eu perdi alguma coisa?
Os atributos
'First
e'Last
estão de fato indisponíveis para tipos privados. Em vez disso, observe que "Unbounded_String
representa umString
cujo limite inferior é 1 e cujo comprimento pode variar conceitualmente entre 0 eNatural'Last
." Além disso, "A funçãoLength
retorna o comprimento doString
representado porSource
." Como resultado, você pode usar aLength
função para pesquisar a partir do fim da string.Isso produz o valor 19 para
I
o seu primeiro exemplo.