Sign in Join
Wiki copytemporary

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.

Revision 1, last changed by WikiArchive .

Talk about this page

Nobody has opened a bench for this page yet. Sign in to open one.