Deconstruct [closed]


#1

Зачем нужен Deconstruct, если без него можно легко обойтись?

procedure Deconstruct<T>(self: T; var res: T); extensionmethod;
begin
  res := self;
end;

В чём его сокровенный смысл, если он всего лишь присваивает значение некоторого объекта другой переменной этого же типа?

Вот так делаются деконструкторы в C#.

Если следовать реализации деконструкторов в C#, то в PascalABC.Net они могут выглядеть так:

type
  TClass = class
    fX, fY, fZ: byte;
    
    constructor Create(x: byte := 0; y: byte := 0; z: byte := 0) := (fX, fY, fZ) := (x, y, z);
    
    procedure Deconstruct(var x, y: byte) := (x, y) := (fX, fY);
    
    procedure Deconstruct(var x, y, z: byte) := (x, y, z) := (fX, fY, fZ);
  end;

begin
  var a := new TClass(1, 2);
  var (x1, y1) := a; // Синтаксический сахар над явным вызовом a.Deconstruct(x1, y1);
  var (x2, y2, z2) := a;
end.

.


#2

Это другое, тут он лишь реализация оператор выбора (match).


#3

Точнее, это внутренняя вспомогательная процедура?


#4

match - это синтаксический сахар, он разворачивается в код на паскале, в котором будет использована эта процедура.


#5

Спасибо за пояснения.


#6