If statement Ada-忽略用于比较的记录字段

If statement Ada-忽略用于比较的记录字段,if-statement,ada,If Statement,Ada,我有一个巨大的记录,并希望使用它进行比较。有没有办法在比较中从记录中省略一个字段,或者我必须逐个检查每个字段 例如: type Apple_T is record Redness_Scale : Integer; Weight : Natural: Age : Natural; Eaten : Boolean; end record; 我想比较一下发红、体重和年龄,但不是吃了什么。有没有一种方法可以在没有三个独立状态集的情况下实现这一点?没有,您必须编写如下代码 return

我有一个巨大的记录,并希望使用它进行比较。有没有办法在比较中从记录中省略一个字段,或者我必须逐个检查每个字段

例如:

type Apple_T is record
  Redness_Scale : Integer;
  Weight : Natural:
  Age : Natural;
  Eaten : Boolean;
end record;

我想比较一下发红、体重和年龄,但不是吃了什么。有没有一种方法可以在没有三个独立状态集的情况下实现这一点?

没有,您必须编写如下代码

return (Left.Redness_Scale = Right.Redness_Scale) and then
       (Left.Weight = Right.Weight) and then
       (Left.Age = Right.Age);
(假设您有一个返回布尔值的函数,用于测试苹果的比较是否相等)。从技术上讲,这不是三个独立的声明。但是不,按照您定义记录的方式,您必须使用三个相等比较

但是,你可能想考虑一下苹果原来的“特性”(而不是别人对苹果的行为)可能会变成自己的抽象,比如

type Apple_Characteristics is record
    Redness_Scale : Integer;
    Weight : Natural:
    Age : Natural;
end record;

type Apple_T is record
    Characteristics : Apple_Characteristics;
    Eaten : boolean;
end record;
现在,您可以用一个相等性测试来比较两个记录的
特征
组件。这是区分特征的一个好处,但也可能有其他好处;如果字段的相关性足够大,以至于比较将这些字段分组在一起,而忽略其他字段,那么很可能还有其他操作也会将这些字段作为一个组来处理


这确实意味着您必须使用
A.Characteristics.Weight
(例如)来获取字段。但是,假设您已经完成了您应该做的事情,并且将
Apple\T
设置为私有类型,并为包的其他用户提供了操作(过程/函数),那么在实现这些操作时,只需要在定义
Apple\T
的包体中添加
.Characteristics
。将
Apple\u特征
分离到另一个记录类型中是一个实现细节,包的用户不需要知道。

对于标记的记录类型,您可以声明自己的相等运算符

它的声明必须单独执行每个所需的比较,或者求助于ajb更紧凑的解决方案(可以重新编写为扩展Apple_Characteristics类型,而不是将其作为一个组件)


因此,相等运算符的声明可能涉及三条语句,但它的使用将非常紧凑。

您始终可以覆盖类型的默认“=”操作

function "=" (Left, Right : Apple_T) return Boolean is
begin
   return Left.Redness_Scale = Right.Redness_Scale and
          Left.Weight        = Right.Weight        and
          Left.Age           = Right.Age;
end "=";

你的类型示例的样式不好。哪些值对红色真正有效?苹果真的可以失重吗

您可以为任何类型声明自己的相等运算符。它不仅限于带标签的记录,甚至更好!出于某种原因,我将该能力与标记类型相关联;也许正是我通常使用它的方式。你对哪些比较感兴趣?"=", "