2

我有大量记录,并希望将其用于比较。有没有办法在比较的记录中省略一个字段,还是我必须单独检查每个字段?

例子:

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

我想比较发红、体重和年龄,而不是吃东西。有没有一种方法可以在没有三个单独的语句的情况下做到这一点?

4

3 回答 3

5

不,您必须编写类似的代码

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;

现在您可以Characteristics通过一个相等性测试来比较两条记录的组成部分。这是分离特征的一个好处,但也可能有其他好处;如果这些字段足够相关,以至于比较将这些字段组合在一起并忽略其他字段,那么很可能还有其他操作本质上也将这些字段视为一个组。

这确实意味着您必须使用A.Characteristics.Weight(例如)才能到达这些领域。但是假设您已经完成了您应该做的事情并创建了Apple_T一个私有类型,并为包的其他用户提供了操作(过程/函数)以供使用,那么添加的需要.Characteristics只发生在定义Apple_T何时添加的包的主体中实现这些操作。将其分离Apple_Characteristics成另一种记录类型是包的用户不需要知道的实现细节。

于 2013-10-30T15:05:21.547 回答
3

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

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 "=";

您的类型示例风格不佳。哪些值对发红真正有效?苹果真的可以失重吗?

于 2013-11-25T10:49:35.433 回答
2

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

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

所以相等运算符的声明可能涉及三个语句,但它的使用会很紧凑。

于 2013-10-30T16:13:09.687 回答