在 Pascal 中可以声明联合类型:
AnimalType = (Dog, Cat);
Animal = record
name: string;
case myType: AnimalType of
Dog: (weight: Integer);
Cat: (age: Integer);
end;
但是,很容易违反case
的约定:
var
a: Animal;
begin
a.name := 'Kittie';
a.myType := Cat;
a.weight := 10; // There is no weight for cats!
writeln(a.age); // Prints 10
end.
此示例中存在语义错误,但编译器已成功对其进行类型检查。另外,运行时也没有错误。
那么,case
block 的存在只是为了文档目的吗?
最佳答案
对您的问题的简短回答是,“变体记录中的案例 block 不只是用于文档目的”。我这样说是因为尽管您使用的 Pascal 实现没有检测到程序访问非事件变体这一事实,但其他实现确实检测到此错误。
您的问题的长答案如下。
许多刚刚学习 Pascal 的人并没有意识到 Pascal 语言有两种主要风格。有 ISO 7185 标准 Pascal(或简称为 Standard Pascal)和 Turbo/Borland Pascal(最流行的变体)。因此,让我对您的问题“那么,case block 是否仅出于文档目的而存在”提供两个答案?
标准帕斯卡答案
标准 Pascal 将错误定义为“程序违反了允许处理器不被发现的本国际标准的要求”。所以,是的,您给出的程序确实包含错误,并且您使用的处理器(即 Pascal 实现)没有检测到它,但其他实现会检测到它,所以变体记录中的 case block 实际上没有功能用途。
Turbo/Borland 的答案
就 Turbo/Borland Pascal 风格而言,我不知道它们是否会检测到此错误,但即使它们都没有检测到,最好将此视为一个错误,而不是它们不会检测到。检测而不是仅用于文档目的。说某些东西仅用于文档目的,在我看来,就像说它从未打算发挥作用。
关于pascal - 了解联合类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29514436/