我有一个巨大的记录,我希望比较使用它。有没有办法在比较中省略记录中的一个字段,还是我必须单独检查每个字段?
示例:
type Apple_T is record
Redness_Scale : Integer;
Weight : Natural:
Age : Natural;
Eaten : Boolean;
end record;
我想比较发红,体重和年龄,但不要吃。有没有一种方法可以在没有三个单独的状态网络的情况下做到这一点?
答案 0 :(得分: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
分隔成另一个记录类型是包的用户不需要了解的实现细节。
答案 1 :(得分: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 "=";
您的类型示例是糟糕的风格。哪些值真的对红色有效?苹果真的可以失重吗?
答案 2 :(得分:2)
对于标记记录类型,您可以声明自己的相等运算符。
它的声明必须单独执行每个必需的比较,或采用ajb更紧凑的解决方案(可以重写为扩展Apple_Characteristics类型而不是将其作为组件包含在内)。
因此,相等运算符的声明可能涉及三个语句,但它的使用将是紧凑的。