了解联合类型

时间:2015-04-08 12:19:36

标签: pascal unions

在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块是否仅用于文档目的?

2 个答案:

答案 0 :(得分:2)

对您的问题的简短回答是,"变体记录中的案例块不仅仅用于文档目的"。我这样说是因为虽然您使用的Pascal实现没有检测到该程序作为访问非活动变体的事实,但其他实现确实检测到此错误。

您的问题的答案如下:

许多刚刚学习Pascal的人都没有意识到Pascal语言有两种主要风格。有ISO 7185标准Pascal(或简称标准Pascal),还有Turbo / Borland Pascal(最受欢迎的变体)。那么,让我给你两个问题的答案"那么,案例块是否仅仅出于文档目的而存在"?

标准帕斯卡答案

标准Pascal将错误定义为"程序违反本国际标准的要求,允许处理器未被检测到"。所以是的,你给出的程序确实包含一个错误,是的,你正在使用的处理器(即Pascal实现)没有检测到它,但是其他实现会检测到它,因此变量记录中的case块实际上没有实际功能。

Turbo / Borland答案

就Turbo / Borland Pascal口味而言,我不知道他们是否都没有发现这个错误,但即使他们都没有这样做,也可能更好地将其视为他们没有检测到的错误,而不仅仅是出于文档目的。说某些东西仅用于记录目的,听起来像是说它从来没有打算发挥作用。

答案 1 :(得分:1)

union可以为变量赋予多种类型。在您的示例中,weightage存储在内存中的相同位置。

如果你想要'typesafe union',你应该使用继承。