我刚读过“Ada Programming”,但我对如何在Ada中使用'
(单引号)感到困惑。
我可以理解'
用于参考属性。 AAA'Image(..),BBB'Value(..)
然而,考虑到这段代码:
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.
但这只是一个GUESS,对此有任何官方语法解释吗?
Q2:'
做了什么?(在“新”声明中)
是属性还是是否还有其他含义?
在哪里可以找到 Ada 中“单引号”的摘要用法?
我花了很长时间试图找出这些信息,但没有运气。
提前谢谢你。英里。
答案 0 :(得分:7)
如果您有Ada参考手册的软拷贝,您可以在语法摘要中搜索'
字符(我在最新版本中附件P;查看目录)。
'
字符用于:
'x'
Foo'Size
Some_Type'(expression)
,Some_Type'Aggregate
它也用于表示子句(现在称为“aspect子句”);这些看起来很像属性引用:for Foo'Size use 32;
。
当然,它可以出现在评论或字符串或字符文字中。
您发布的代码中的示例是一个限定表达式。
建议:在字符文字以外的上下文中,字符'
应该被称为撇号,因为它不作为引号。对于属性和限定表达式,它有时会发音为“tick”:我将Foo'Size
读作“foo tick size”。
(而new
是一个表达式,而不是一个陈述。)
答案 1 :(得分:4)
你似乎特意询问合格的表达方式(基思在答案中的第三个子弹)。
在Ada中,如果您有两个不同类型的对象,您可以尝试使用目标类型的名称(如函数名称)进行转换,如下所示:
Foo:常数整数:=整数(2.35);
一般来说,这只适用于两种类型都是数字类型,或者一种是从另一种派生的(声明为type New_Type is new Old_Type
...)。
编译器当然必须添加代码以验证该值是否属于目标类型可能具有的任何约束。但这对于简单的类型转换非常有用。
但是,当您处理表达式时,有时您想要的不是转换,而是告诉编译器使用表达式的类型。不需要(运行时)代码来执行此操作,只需将表达式设置为我告诉您的类型即可。
编译器通常可以从上下文中解决这个问题,但有时他们不能。这就是撇号的用武之地。它告诉编译器不要将表达式转换到指定的类型,而是首先将它创建为该类型。
最常见的用途是执行动态分配,如示例所示。有时候可能会有其他情况需要它。一个例子可能是将文字值传递给重载例程。假设您有两个版本的过程My_Routine
,一个接收Integer
,另一个接受不同的自定义整数类型。如果将对象传递给它,编译器只需查看对象的类型即可。但是,如果传入文字1
,很可能会出现编译错误,表达式不明确。
你可以通过将你的文字1
放入一个常量整数然后传入(然后抱怨你的愚蠢的编译器)来解决这个问题。但是,更容易做的事情如下:
My_Routine (Integer'(1));
这解决了编译器的歧义。这不是“转换”,因此不需要额外的代码。您只是告诉编译器以下表达式是Integer
类型。