По сути, будучи подмножеством набора (всех) навыков, slob
является элементом набора мощности набора (всех) навыков.
В Паскале, set of A
, где A
- некоторый порядковый тип, - это тип, представляющий математический набор элементов типа A
.Точнее, каждое значение этого типа является таким математическим набором.Например, в Delphi (современная версия Pascal) у вас есть перечисление
TFontStyle = (fsBold, fsItalic, fsUnderline, fsStrikeOut)
и соответствующий тип набора TFontStyles = set of TFontStyle
.В то время как значение типа TFontStyle
представляет собой просто fsBold
, fsItalic
, fsUnderline
или fsStrikeOut
, значение типа TFontStyles
представляет собой набор стилей шрифта (или атрибутов), например [fsBold, fsUnderline]
.Если вы установите для свойства 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.
Теперь, учитывая перечисление Паскаля
skill = (cooking, cleaning, driving, gaming, eating)
set of skill
- это тип, значения которого являются наборамиskill
значений, таких как [cooking, cleaning]
или [cleaning, gaming, eating]
(с использованием синтаксиса Паскаля).Очевидно, что каждое такое значение - подмножество A - является элементом P (A), во многом так же, как каждое значение типа skill
является элементомсамого А1058 * в переменную slob
.Это значение типа set of skill
, и это конкретное значение содержит элементы videogames
и eating
.
. Под капотом заданное значение в Delphi представляется с использованием количества байтов (каждый набортип имеет определенный размер), и каждый возможный элемент в наборе представлен определенным битом.В Delphi тип set of A
разрешен, только если A
имеет не более 256 значений.Если 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 ГБ.Это огромный объем памяти для одной переменной!