Здраствуйте, я можно сказать случайным образом нашел в модуле GraphWPF функцию Redraw(), которая в документации не описана. Ее назначение - процедура синхронизация вывода графики. Если мы откроем справочный файл по данному модулю, то найдем функцию invoke() с таким же описанием, но есть проблема. Этой функции просто нет, даже уже написав ее в редакторе не видно никаких подсказок. Когда запускаешь программу, выдается ошибка, о том что invoke неизвестное имя.
То есть вопрос в чем: Почему в документации есть нерабочая функция Invoke() и нет функции redraw()?
type
T = class
end;
function operator+(var x, y: T); extensionmethod := default(T);
procedure operator+=(var x, y: T); extensionmethod := exit;
function operator-(var x, y: T); extensionmethod := default(T);
procedure operator-=(var x, y: T); extensionmethod := exit;
function operator*(var x, y: T); extensionmethod := default(T);
procedure operator*=(var x, y: T); extensionmethod := exit;
function operator/(var x, y: T); extensionmethod := default(T);
procedure operator/=(var x, y: T); extensionmethod := exit;
function operator mod(var x, y: T); extensionmethod := default(T);
function operator div(var x, y: T); extensionmethod := default(T);
function operator=(var x, y: T); extensionmethod := false;
function operator<>(var x, y: T); extensionmethod := false;
function operator<(var x, y: T); extensionmethod := false;
function operator<=(var x, y: T); extensionmethod := false;
function operator>(var x, y: T); extensionmethod := false;
function operator>=(var x, y: T); extensionmethod := false;
// Недопустимо использование var в первом параметре extension-метода
//function ExtensionA(var self, y: T); extensionmethod := default(T);
//procedure ExtensionB(var self, y: T); extensionmethod := exit;
begin
end.
Хотелось бы выяснить причину данного запрета (для себя). Код выше доказывает то, что в операторах расширения var параметры разрешены, в отличии от процедур и функций расширения.
Нет. Такое использование и не предполагалось. Предполагался, следующий код:
type
T = record
public X: integer;
end;
procedure Change(var self: T); extensionmethod := self.X := 2;
begin
end.
Не могу оценить насколько было бы это полезно - на практике таким пользоваться не приходилось. Могу лишь указать на тот факт, что эта возможность языка предусматривалась бы не для повседневного пользования, как трейты. И также обращаю внимание на то, что данное сообщение не побуждение разработчиков изменять свой язык.
Это оператор, а их присваивать можно только коротким процедурам
Но вот здесь всё-таки должно выводиться 2, а потому нужен var:
type
T = record
public X: integer;
end;
procedure Change({var} self: T); extensionmethod := self.X := 2;
begin
var v := new T;
v.Change;
v.X.Print;//0
end.
@Admin может неявно делать self - var-параметром, если у него размерный тип? Тогда extensionmethod-ы будут работать так же как просто методы в случае записей.