基本上,作为(所有)技能集的一个子集,slob 是(所有)技能集的力量集的一个元素。
在 Pascal 中,set of A(其中A 是某种序数类型)是表示A 类型元素的数学集合的类型。更准确地说,这种类型的每个值都是这样一个数学集合。例如,在 Delphi(Pascal 的现代版本)中,您有
TFontStyle = (fsBold, fsItalic, fsUnderline, fsStrikeOut)
枚举和对应的TFontStyles = set of TFontStyle 设置类型。虽然TFontStyle 类型的值只是fsBold、fsItalic、fsUnderline 或fsStrikeOut 中的任一个,但TFontStyles 类型的值是一组字体样式(或属性),例如@ 987654336@。如果您将标签的Font.Style 属性设置为该值,则标签的字体将为粗体并带有下划线。
您似乎明白这一点,所以让我转而关注“幂集”概念,您似乎对此感到困惑。
使用数学语法,考虑集合
A = {cooking, cleaning, driving, gaming, eating}
技能。 A 的幂集,有时表示为 P(A) 或 2^A,是 A 的所有子集的集合。(因此,它是一个集合,其成员是集合。)下面列出了这个集合的一些成员:
{} (=the empty set)
{cooking}
{driving}
{cooking, cleaning}
{cleaning, gaming, eating}
{cooking, cleaning, driving, eating}
{cooking, cleaning, driving, gaming, eating} (=A)
总共,P(A) 由 2^|A| 组成= 2^5 = 32 个元素。实际上,在 A 的给定子集中,cooking 要么是它的一部分,要么不是(2 个选项),对于每个选项,cleaning 要么是子集的一部分,要么不是(2 个选项) , 等等。因此,组合的总数变为 2×2×...×2 = 32。
现在,给定 Pascal 枚举
skill = (cooking, cleaning, driving, gaming, eating)
set of skill 是一种类型,其值是skill 值的集合,例如[cooking, cleaning] 或[cleaning, gaming, eating](使用Pascal 语法)。显然,每个这样的值——A 的 子集——是 P(A) 的 元素,与 skill 类型的每个值的方式大致相同A 本身的一个元素。
你特意问了,
我们从slob := [videogames, eating] 命令得到什么?
您将值 [videogames, eating] 分配给变量 slob。这是一个set of skill 类型的值,这个特定的值包含成员videogames 和eating。
在底层,Delphi 中的集合值使用多个字节表示(每个集合类型都有特定的大小),集合中每个可能的元素都由一个特定的位表示。在 Delphi 中,仅当 A 的值不超过 256 个时才允许使用类型 set of A。如果A 有这么多值(比如A 是byte),这就要求set of A 有256 位(这样就有2^256 = 1.16 × 10^77 个set of A 类型的可能值)。
有时人们想知道为什么他们不能声明类型set of integer。但是一个整数是一个 32 位的值,所以有 2^32 = 4294967296 个这样的值。因此,假设类型 set of integer 的值将需要 4294967296 字节或 4 GB。这对于单个变量来说是一个巨大的内存量!