Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / reference to procedure и метод класса / 17 сообщений из 17, страница 1 из 1
31.07.2018, 12:18
    #39681509
Квейд
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
reference to procedure и метод класса
Есть тип

Код: pascal
1.
TFunc<TResult> = reference to function: TResult



Есть функция

Код: pascal
1.
class function TSpinWait.SpinUntil(const ACondition: TFunc<Boolean>; Timeout: LongWord): Boolean;



Я вызываю так

Код: pascal
1.
while not TSpinWait.SpinUntil(IsMyThreadFinished, INFINITE) do



где IsMyThreadFinished это функция-метод класса.

Программа компилируется. Но у меня такое чувство, что есть подводный камень, ибо у определения TFunc<TResult> отсутствует of object. Что скажет общество по этому поводу?

When a movie is over, it's a black
...
Рейтинг: 0 / 0
31.07.2018, 12:38
    #39681519
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
reference to procedure и метод класса
КвейдЧто скажет общество по этому поводу?
У классовых функций нет self. Если, конечно, еще что-нибудь не придумали.

Но вообще отладчик - классная штука.
...
Рейтинг: 0 / 0
31.07.2018, 13:18
    #39681543
Guest2013
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
reference to procedure и метод класса
Квейд,

а если написать по другому что нибудь измениться?
Код: pascal
1.
2.
3.
4.
5.
6.
while not TSpinWait.SpinUntil(
    function: Boolean
    begin
      Result := {что-то проверяем};
    end
    , INFINITE) do
...
Рейтинг: 0 / 0
31.07.2018, 13:28
    #39681549
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
reference to procedure и метод класса
как объявлена IsMyThreadFinished ?
Хотя любом объявлении будет работать такой подход (чуть модифицированный код выше):
Код: pascal
1.
2.
3.
4.
5.
6.
while not TSpinWait.SpinUntil(
    function: Boolean
    begin
      Result := IsMyThreadFinished;
    end
    , INFINITE) do
...
Рейтинг: 0 / 0
31.07.2018, 13:55
    #39681561
Квейд
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
reference to procedure и метод класса
wadmanКвейдЧто скажет общество по этому поводу?
У классовых функций нет self. Если, конечно, еще что-нибудь не придумали.

Я написал "функция-метод класса", причем тут классовые функции?
...
Рейтинг: 0 / 0
31.07.2018, 13:58
    #39681564
Квейд
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
reference to procedure и метод класса
Guest2013Квейд,

а если написать по другому что нибудь измениться?
Код: pascal
1.
2.
3.
4.
5.
6.
while not TSpinWait.SpinUntil(
    function: Boolean
    begin
      Result := {что-то проверяем};
    end
    , INFINITE) do

Так работает, само собой. Но у меня в классе уже есть такая функция, получается, что анонимка просто продублирует функционал.


Итак, если я хочу честно передать в SpinUntil функцию-медод класса, должен ли ACondition быть объявлен как

Код: pascal
1.
TFunc<TResult> = reference to function: TResult of object

?
...
Рейтинг: 0 / 0
31.07.2018, 14:19
    #39681573
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
reference to procedure и метод класса
КвейдНо у меня такое чувство, что есть подводный камень,Нет. Анонимные функции и методы односторонне совместимы
http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Anonymous_Methods_in_Delphi Method references can also be assigned to methods as well as anonymous methods . For example:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
type
  TMethRef = reference to procedure(x: Integer);
TMyClass = class
  procedure Method(x: Integer);
end;

var
  m: TMethRef;
  i: TMyClass;
begin
  // ...
  m := i.Method;   //assigning to method reference
end;


However, the converse is not true: you cannot assign an anonymous method to a regular method pointer.
...
Рейтинг: 0 / 0
31.07.2018, 14:20
    #39681574
Квейд
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
reference to procedure и метод класса
_Vasilisk_,

спасибо!
...
Рейтинг: 0 / 0
31.07.2018, 15:02
    #39681604
Guest2013
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
reference to procedure и метод класса
Квейд,

Референсы(лямбды) предполагают в вызове метода применение различных реализаций одной и той же функции. Если в классе реализована всего лишь одна такая функция то референсы теряют смысл применения.
В противном случае (если реализаций в классе много) можно например завести переменную референсного типа внутри класса и работать через нее.
...
Рейтинг: 0 / 0
31.07.2018, 15:37
    #39681624
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
reference to procedure и метод класса
Guest2013Если в классе реализована всего лишь одна такая функция то референсы теряют смысл применения.Референс могут использовать разные классы
...
Рейтинг: 0 / 0
31.07.2018, 17:01
    #39681674
общество
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
reference to procedure и метод класса
КвейдПрограмма компилируется.
врёшь! или не договариваешь, что
Код: pascal
1.
while not TSpinWait.SpinUntil(IsMyThreadFinished, INFINITE) do


у тебя внутри класса где реализована IsMyThreadFinished, а self туда скрыто и заезжает.
...
Рейтинг: 0 / 0
31.07.2018, 17:48
    #39681703
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
reference to procedure и метод класса
wadmanКвейдЧто скажет общество по этому поводу?
У классовых функций нет self. Если, конечно, еще что-нибудь не придумали.

У статических нет, у классовых - есть и это ClassType (т.е. ссылка на сам класс).
Можно например написать:
Код: pascal
1.
2.
3.
4.
5.
...
class function TSomeClass.New: TSomeClass;
begin
  Result := Self.Create;
  ...
...
Рейтинг: 0 / 0
01.08.2018, 08:29
    #39681834
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
reference to procedure и метод класса
Квейд,

+1 alekcvp

они ещё и виртуальными могут быть, а это без доп-параметра не сделать
...
Рейтинг: 0 / 0
01.08.2018, 08:35
    #39681835
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
reference to procedure и метод класса
КвейдПрограмма компилируется. Но у меня такое чувство, что есть подводный камень, ибо у определения TFunc<TResult> отсутствует of object. Что скажет общество по этому поводу?есть подводный камень
При объявлении функции внутри тела (безымянная функция), в созданный интерфейс захватываются локальные переменные. Например, это может привести к неприятным последствиям при использовании самоменеджируемых типов вроде интерфейсов
...
Рейтинг: 0 / 0
01.08.2018, 10:37
    #39681882
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
reference to procedure и метод класса
[quot kealon(Ruslan)Например, это может привести к неприятным последствиям при использовании самоменеджируемых типов вроде интерфейсов[/quot]
Я правильно понимаю, что если в процедуре, где используются безымянные функции, будет переменная типа SomeVar: ISomeIntf; то она, после выхода из процедуры, будет существовать до тех пор пока мы не уничтожим объект, куда назначена безымянная функция? Ну или пока что-то внутри него не занилит ссылку на неё?
...
Рейтинг: 0 / 0
01.08.2018, 10:47
    #39681888
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
reference to procedure и метод класса
alekcvp[quot kealon(Ruslan)Например, это может привести к неприятным последствиям при использовании самоменеджируемых типов вроде интерфейсов
Я правильно понимаю, что если в процедуре, где используются безымянные функции, будет переменная типа SomeVar: ISomeIntf; то она, после выхода из процедуры, будет существовать до тех пор пока мы не уничтожим объект, куда назначена безымянная функция? Ну или пока что-то внутри него не занилит ссылку на неё?[/quot]
по идее да.
Анонимный метод в delphi реализован через интерфейс методом invoke
можно даже приводить их между собой
...
Рейтинг: 0 / 0
01.08.2018, 10:49
    #39681889
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
reference to procedure и метод класса
alekcvpkealon(Ruslan)Например, это может привести к неприятным последствиям при использовании самоменеджируемых типов вроде интерфейсов
Я правильно понимаю, что если в процедуре, где используются безымянные функции, будет переменная типа SomeVar: ISomeIntf; то она, после выхода из процедуры, будет существовать до тех пор пока мы не уничтожим объект, куда назначена безымянная функция? Ну или пока что-то внутри него не занилит ссылку на неё?правильно
например, проявлялось при использовании метода Synchronize (в 10-ке его исправили)
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / reference to procedure и метод класса / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]