7

我刚刚阅读了“Ada Programming”,但我对如何'在 Ada 中使用(单引号)有点困惑。

我可以理解'为引用属性。AAA'图像(..),BBB'值(..)

但是,考虑到这段代码:

   type Plain_Vector (Capacity : Capacity_Subtype) is record
      Elements : Elements_Array (1 .. Capacity);
      Last     : Extended_Index := No_Index;
      Busy     : Natural := 0;
      Lock     : Natural := 0;
   end record;
 ------------------------------------------------------------------
   new Plain_Vector'(2, (Left, Right), Last => Last, others => <>)

Q1: “new”语句的参数如何匹配类型的参数和记录字段?

 I can GUESS "2" matched "Capacity", 
             "(Left, Right)" matched "Elements", 
             "Last => Last" matched "Last"
             "Others => <>" matched "Busy" and "Lock" to let them use default value.

但这只是一个猜测,官方对此有语法解释吗?

Q2:'做什么的?(在“新”声明中)

它是一个属性还是有其他含义?

我在哪里可以找到Ada 中“单引号”的摘要用法

我花了很长时间试图找出这些信息,但没有运气。

先感谢您。迈尔斯。

4

2 回答 2

9

如果您有 Ada Reference Manual 的电子版,您可以'在 Syntax Summary 中搜索该字符(这是我最新版本的 Annex P;查看目录)。

'字符用于:

  • 字符文字:'x'
  • 属性参考:Foo'Size
  • 限定表达式:Some_Type'(expression),Some_Type'Aggregate

它也用于表示子句(现在称为“方面子句”);这些看起来很像属性引用:for Foo'Size use 32;.

当然,它可以出现在注释或字符串或字符文字中。

您发布的代码中的示例是一个限定表达式。

建议:在字符文字以外的上下文中,该字符'可能应该被称为撇号,因为它不充当引号。对于属性和限定表达式,有时发音为“tick”:我读Foo'Size作“foo tick size”。

(并且new是一个表达式,而不是一个语句。)

于 2011-09-27T04:53:36.033 回答
5

您似乎在专门询问合格的表达式(Keith 在他的回答中的第三个项目符号)。

在 Ada 中,如果您有两个不同类型的对象,您可以尝试使用目标类型的名称(如函数名称)在它们之间进行转换,如下所示:

Foo : 常量 Integer := Integer (2.35);

通常,这仅适用于两种类型都是数字类型,或者一种是从另一种派生的(声明为type New_Type is new Old_Type...)。

编译器当然必须添加代码来验证该值是否在目标类型可能具有的任何约束范围内。但这对于简单的类型转换非常有用。

但是,当您处理表达式时,有时您想要的不是转换,而是告诉编译器制作表达式的类型。不需要(运行时)代码来执行此操作,只需将表达式设为我告诉您的类型即可。

编译器通常可以从上下文中弄清楚这一点,但有时他们不能。这就是撇号出现的地方。它告诉编译器不要表达式转换为指定的类型,而是首先将其创建为该类型。

最常见的用途是在执行动态分配时,如您的示例所示。有时可能还有其他需要它的情况。一个示例可能是将文字值传递给重载例程时。假设您有两个版本的 procedure My_Routine,一个接受 an Integer,另一个接受不同的自定义整数类型。如果您将对象传递给它,编译器可以只查看对象的类型。然而,如果你传入一个字面量1,你很可能会得到一个表达式不明确的编译器错误。

您可以通过将文字1放入一个常量整数并将其传入(然后抱怨您的愚蠢编译器)来解决此问题。但是,更容易做的事情如下:

My_Routine (Integer'(1));

这解决了编译器的歧义。这不是“转换”,因此不需要额外的代码。你只是告诉编译器下面的表达式是 type Integer

于 2011-09-27T13:05:09.057 回答