在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
块是否仅用于文档目的?
答案 0 :(得分:2)
对您的问题的简短回答是,"变体记录中的案例块不仅仅用于文档目的"。我这样说是因为虽然您使用的Pascal实现没有检测到该程序作为访问非活动变体的事实,但其他实现确实检测到此错误。
您的问题的答案如下:
许多刚刚学习Pascal的人都没有意识到Pascal语言有两种主要风格。有ISO 7185标准Pascal(或简称标准Pascal),还有Turbo / Borland Pascal(最受欢迎的变体)。那么,让我给你两个问题的答案"那么,案例块是否仅仅出于文档目的而存在"?
标准帕斯卡答案
标准Pascal将错误定义为"程序违反本国际标准的要求,允许处理器未被检测到"。所以是的,你给出的程序确实包含一个错误,是的,你正在使用的处理器(即Pascal实现)没有检测到它,但是其他实现会检测到它,因此变量记录中的case块实际上没有实际功能。
Turbo / Borland答案
就Turbo / Borland Pascal口味而言,我不知道他们是否都没有发现这个错误,但即使他们都没有这样做,也可能更好地将其视为他们没有检测到的错误,而不仅仅是出于文档目的。说某些东西仅用于记录目的,听起来像是说它从来没有打算发挥作用。
答案 1 :(得分:1)
union可以为变量赋予多种类型。在您的示例中,weight
和age
存储在内存中的相同位置。
如果你想要'typesafe union',你应该使用继承。