我有大量记录,并希望将其用于比较。有没有办法在比较的记录中省略一个字段,还是我必须单独检查每个字段?
例子:
type Apple_T is record
Redness_Scale : Integer;
Weight : Natural:
Age : Natural;
Eaten : Boolean;
end record;
我想比较发红、体重和年龄,而不是吃东西。有没有一种方法可以在没有三个单独的语句的情况下做到这一点?
我有大量记录,并希望将其用于比较。有没有办法在比较的记录中省略一个字段,还是我必须单独检查每个字段?
例子:
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;
现在您可以Characteristics
通过一个相等性测试来比较两条记录的组成部分。这是分离特征的一个好处,但也可能有其他好处;如果这些字段足够相关,以至于比较将这些字段组合在一起并忽略其他字段,那么很可能还有其他操作本质上也将这些字段视为一个组。
这确实意味着您必须使用A.Characteristics.Weight
(例如)才能到达这些领域。但是假设您已经完成了您应该做的事情并创建了Apple_T
一个私有类型,并为包的其他用户提供了操作(过程/函数)以供使用,那么添加的需要.Characteristics
只发生在定义Apple_T
何时添加的包的主体中实现这些操作。将其分离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 "=";
您的类型示例风格不佳。哪些值对发红真正有效?苹果真的可以失重吗?
对于标记的记录类型,您可以声明自己的相等运算符。
它的声明必须单独执行每个所需的比较,或者求助于 ajb 更紧凑的解决方案(可以重写为扩展 Apple_Characteristics 类型,而不是将其作为组件包含在内)。
所以相等运算符的声明可能涉及三个语句,但它的使用会很紧凑。