Копия викизеркало

Это зеркало вики с pascal.chat. Правка, история и вход — там.

Set/ru

Deutsch · English · Français · Suomi · Русский

Введение

Set представляет собой множество элементов из перечисленного набора значений и является порядковым типом.

В качестве примера рассмотрим следующее перечисление:

pascal
  TSpeed = (spVerySlow,spSlow,spAVerage,spFast,spVeryFast);

И такое множество:

pascal
  TPossibleSpeeds = set of TSpeed

Значения множества TPossibleSpeeds могут быть определены с помощью скобок для перечисления элементов:

pascal
  const
    RatherSlow = [spVerySlow,spSlow];
    RatherFast = [spFast,spVeryFast];

RatherSlow и RatherFast представляют некоторое множество из TSpeed.

Операции над множествами

В модуле System библиотеки RTL определены две функции, использующиеся для операций над множествами: Include(ASet,AValue) и Exclude(ASet,AValue).

pascal
  var
    SomeSpeeds: TPossibleSpeeds;
  begin
    SomeSpeeds := [];
    Include(SomeSpeeds,spVerySlow);
    Include(SomeSpeeds,spVeryFast);
  end;

Множествами нельзя управлять напрямую, если они находятся в разделе published. Обычно в этом случае вам необходимо создать локальную копию, изменить её значение и затем вызвать setter.

pascal
  procedure TSomething.DoSomething(Sender: TFarObject);
  var
    LocalCopy: TPossibleSpeeds;
  begin
    LocalCopy := Sender.PossibleSpeeds; // getter to local
    Include(LocalCopy,spVerySlow);
    Sender.PossibleSpeeds := LocalCopy; // local to setter.
  end;

С помощью ключевого слова in можно также проверить, принадлежит ли значение множеству. Обычно оно используется следующим образом:

pascal
  var
    CanBeSlow: Boolean;
  const
    SomeSpeeds = [Low(TSpeed)..High(TSpeed)];
  begin
    CanBeSlow := (spVerySlow in SomeSpeeds) or (spSlow in SomeSpeeds);
  end;

Битовые маски

Множества могут использоваться для создания битовых масок, как показано в следующем примере.

pascal
(*
  FLAG_A = 1;  // 1 shl 0
  FLAG_B = 2;  // 1 shl 1
  FLAG_C = 4;  // 1 shl 2 
*)

type
  TFlag = (FLAG_A, FLAG_B, FLAG_C);
  TFlags = set of TFlag;

var
  Flags: TFlags;

[..]
  Flags:= [FLAG_A, FLAG_C];
  if FLAG_A in Flags then ..  // проверяет, установлен ли FLAG_A в переменной Flags

From the Free Pascal wiki, page "Set/ru", as it stood on 2021-02-16 after a change by Zoltanleo, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's Licensing page. If you have concerns about this material, message the admin.

Версия 1, последнее изменение: WikiArchive, .