不能在无界字符串上使用“First”和“Last”

问题描述 投票:0回答:1

当尝试获取无界字符串的第一个或最后一个索引时,如本程序所示

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 抱怨

U_Str.Unbounded_String
是私有类型:

$ 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

我不明白这一点,与常规

String
相同的程序工作正常:

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

无界字符串没有

'First
'Last
属性吗? Ada 参考手册 仅说明

以下属性是为数组类型的前缀 A 定义的(在任何隐式取消引用之后),或表示受约束的数组子类型

但它没有提及任何有关私有类型的信息。这是 GNAT 错误还是我错过了什么?

string ada
1个回答
0
投票

属性

'First
'Last
确实对于私有类型不可用。 相反,请注意“
Unbounded_String
表示
String
,其下限为 1,其长度概念上可以在 0 和
Natural'Last
之间变化。”此外,“函数
Length
返回由
String
表示的
Source
的长度。”因此,您可以使用
Length
函数从字符串末尾开始搜索。

From => U_Str.Length(S));

这会在第一个示例中为

I
生成值 19。

© www.soinside.com 2019 - 2024. All rights reserved.